iOS面试知识竞赛真题精选.docx

上传人:w**** 文档编号:8862819 上传时间:2023-05-15 格式:DOCX 页数:24 大小:22.46KB
下载 相关 举报
iOS面试知识竞赛真题精选.docx_第1页
第1页 / 共24页
iOS面试知识竞赛真题精选.docx_第2页
第2页 / 共24页
iOS面试知识竞赛真题精选.docx_第3页
第3页 / 共24页
iOS面试知识竞赛真题精选.docx_第4页
第4页 / 共24页
iOS面试知识竞赛真题精选.docx_第5页
第5页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

iOS面试知识竞赛真题精选.docx

《iOS面试知识竞赛真题精选.docx》由会员分享,可在线阅读,更多相关《iOS面试知识竞赛真题精选.docx(24页珍藏版)》请在冰点文库上搜索。

iOS面试知识竞赛真题精选.docx

iOS面试知识竞赛真题精选

  [填空题]1#import跟#include又什么区别,@class呢,#import<>

  跟#import””又什么区别?

  参考答案:

#import是Objective-C导入头文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会自动只导入一次,不会重复导入,相当于#include和#pragmaonce;@class告诉编译器某个类的声明,当执行时,才去查看类的实现文件,可以解决头文件的相互包含;#import<>用来包含系统的头文件,#import””用来包含用户头文件。

  [填空题]2写一个setter方法用于完成@property(nonatomic,retain)NSString*name

  参考答案:

  [填空题]3常见的object-c的数据类型有那些,和C的基本数据类型有什么区别?

如:

NSInteger和int

  参考答案:

  [填空题]4bjective-C如何对内存管理的,说说你的看法和解决方法?

  参考答案:

  Objective-C的内存管理主要有三种方式ARC(自动内存计数)、手动内存计数、内存池。

  1).(GarbageCollection)自动内存计数:

这种方式和java类似,在你的程序的执行过程中。

始终有一个高人在背后准确地帮你收拾垃圾,你不用考虑它什么时候开始工作,怎样工作。

你只需要明白,我申请了一段内存空间,当我不再使用从而这段内存成为垃圾的时候,我就彻底的把它忘记掉,反正那个高人会帮我收拾垃圾。

遗憾的是,那个高人需要消耗一定的资源,在携带设备里面,资源是紧俏商品所以iPhone不支持这个功能。

所以“GarbageCollection”不是本入门指南的范围,对“GarbageCollection”内部机制感兴趣的同学可以参考一些其他的资料,不过说老实话“GarbageCollection”不大适合适初学者研究。

  解决:

通过alloc–initial方式创建的,创建后引用计数+1,此后每retain一次引用计数+1,那么在程序中做相应次数的release就好了.2).(ReferenceCounted)手动内存计数:

就是说,从一段内存被申请之后,就存在一个变量用于保存这段内存被使用的次数,我们暂时把它称为计数器,当计数器变为0的时候,那么就是释放这段内存的时候。

比如说,当在程序A里面一段内存被成功申请完成之后,那么这个计数器就从0变成1(我们把这个过程叫做alloc),然后程序B也需要使用这个内存,那么计数器就从1变成了2(我们把这个过程叫做retain)。

紧接着程序A不再需要这段内存了,那么程序A就把这个计数器减1(我们把这个过程叫做release);程序B也不再需要这段内存的时候,那么也把计数器减1(这个过程还是release)。

  当系统(也就是Foundation)发现这个计数器变成员了0,那么就会调用内存回收程序把这段内存回收(我们把这个过程叫做dealloc)。

顺便提一句,如果没有Foundation,那么维护计数器,释放内存等等工作需要你手工来完成。

  解决:

一般是由类的静态方法创建的,函数名中不会出现alloc或init字样,如[NSStringstring]和[NSArrayarrayWithObject:

],创建后引用计数+0,在函数出栈后释放,即相当于一个栈上的局部变量.当然也可以通过retain延长对象的生存期.3).(NSAutoRealeasePool)内存池:

可以通过创建和释放内存池控制内存申请和回收的时机.解决:

是由autorelease加入系统内存池,内存池是可以嵌套的,每个内存池都需要有一个创建释放对,就像main函数中写的一样.使用也很简单,比如[[[NSStringalloc]initialWithFormat:

@”Heyyou!

”]autorelease],即将一个NSString对象加入到最内层的系统内存池,当我们释放这个内存池时,其中的对象都会被释放.

  [填空题]5内存管理的几条原则时什么?

按照默认法则.那些关键字生成的对象需要手动释放?

在和property结合的时候怎样有效的避免内存泄露?

  参考答案:

谁申请,谁释放遵循CocoaTouch的使用原则;内存管理主要要避免“过早释放”和“内存泄漏”,对于“过早释放”需要注意@property设置特性时,一定要用对特性关键字,对于“内存泄漏”,一定要申请了要负责释放,要细心。

  关键字alloc或new生成的对象需要手动释放;设置正确的property属性,对于retain需要在合适的地方释放

  [填空题]6MVC设计模式是什么?

你还熟悉什么设计模式?

  参考答案:

设计模式:

并不是一种新技术,而是一种编码经验,使用比如java中的接口,iphone中的协议,继承关系等基本手段,用比较成熟的逻辑去处理某一种类型的事情,总结为所谓设计模式。

面向对象编程中,java已经归纳了23种设计模式。

  mvc设计模式:

模型,视图,控制器,可以将整个应用程序在思想上分成三大块,对应是的数据的存储或处理,前台的显示,业务逻辑的控制。

  Iphone本身的设计思想就是遵循mvc设计模式。

其不属于23种设计模式范畴。

  代理模式:

代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用.比如一个工厂生产了产品,并不想直接卖给用户,而是搞了很多代理商,用户可以直接找代理商买东西,代理商从工厂进货.常见的如QQ的自动回复就属于代理拦截,代理模式在iphone中得到广泛应用.单例模式:

说白了就是一个类不通过alloc方式创建对象,而是用一个静态方法返回这个类的对象。

系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为,比如想获得[UIApplicationsharedApplication];任何地方调用都可以得到UIApplication的对象,这个对象是全局唯一的。

  观察者模式:

当一个物体发生变化时,会通知所有观察这个物体的观察者让其做出反应。

实现起来无非就是把所有观察者的对象给这个物体,当这个物体的发生改变,就会调用遍历所有观察者的对象调用观察者的方法从而达到通知观察者的目的。

  [填空题]7类别的作用?

继承和类别在实现中有何区别?

  参考答案:

  category可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改,并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。

  类别主要有3个作用:

  1).将类的实现分散到多个不同文件或多个不同框架中。

  2).创建对私有方法的前向引用。

  3).向对象添加非正式协议。

  继承可以增加,修改或者删除方法,并且可以增加属性。

  [填空题]8oc中的协议和java中的接口概念有何不同?

  参考答案:

  OC中的代理有2层含义,官方定义为formal和informalprotocol。

前者和Java接口一样。

  informalprotocol中的方法属于设计模式考虑范畴,不是必须实现的,但是如果有实现,就会改变类的属性。

  其实关于正式协议,类别和非正式协议我很早前学习的时候大致看过,也写在了学习教程里“非正式协议概念其实就是类别的另一种表达方式“这里有一些你可能希望实现的方法,你可以使用他们更好的完成工作”。

  这个意思是,这些是可选的。

比如我门要一个更好的方法,我们就会申明一个这样的类别去实现。

然后你在后期可以直接使用这些更好的方法。

  这么看,总觉得类别这玩意儿有点像协议的可选协议。

”现在来看,其实protocal已经开始对两者都统一和规范起来操作,因为资料中说“非正式协议使用interface修饰“,现在我们看到协议中两个修饰词:

  “必须实现(@requied)”和“可选实现(@optional)”。

  [填空题]9简述oc中可修改和不可以修改类型。

  参考答案:

可修改不可修改的集合类。

这个我个人简单理解就是可动态添加修改和不可动态添加修改一样。

  比如NSArray和NSMutableArray。

前者在初始化后的内存控件就是固定不可变的,后者可以添加等,可以动态申请新的内存空间。

  [填空题]10简述通知和协议的不同之处?

  参考答案:

协议有控制链(has-a)的关系,通知没有。

  首先我一开始也不太明白,什么叫控制链(专业术语了~)。

但是简单分析下通知和代理的行为模式,我们大致可以有自己的理解简单来说,通知的话,它可以一对多,一条消息可以发送给多个消息接受者。

  代理按我们的理解,到不是直接说不能一对多,比如我们知道的明星经济代理人,很多时候一个经济人负责好几个明星的事务。

  只是对于不同明星间,代理的事物对象都是不一样的,一一对应,不可能说明天要处理A明星要一个发布会,代理人发出处理发布会的消息后,别称B的发布会了。

但是通知就不一样,他只关心发出通知,而不关心多少接收到感兴趣要处理。

  因此控制链(has-a从英语单词大致可以看出,单一拥有和可控制的对应关系。

  [填空题]11frame和bounds有什么不同?

  参考答案:

  frame指的是:

该view在父view坐标系统中的位置和大小。

  (参照点是父亲的坐标系统)bounds指的是:

该view在本身坐标系统中的位置和大小。

  (参照点是本身坐标系统)

  [填空题]12是否在一个视图控制器中嵌入两个tableview控制器?

  参考答案:

一个视图控制只提供了一个View视图,理论上一个tableViewController也不能放吧,只能说可以嵌入一个tableview视图。

当然,题目本身也有歧义,如果不是我们定性思维认为的UIViewController,而是宏观的表示视图控制者,那我们倒是可以把其看成一个视图控制者,它可以控制多个视图控制器,比如TabbarController那样的感觉。

  [填空题]13什么时候使用NSMutableArray,什么时候使用NSArray?

  参考答案:

当数组在程序运行时,需要不断变化的,使用NSMutableArray,当数组在初始化后,便不再改变的,使用NSArray。

需要指出的是,使用NSArray只表明的是该数组在运行时不发生改变,即不能往NSAarry的数组里新增和删除元素,但不表明其数组內的元素的内容不能发生改变。

NSArray是线程安全的,NSMutableArray不是线程安全的,多线程使用到NSMutableArray需要注意。

  [填空题]14在应用中可以创建多少autorelease对象,是否有限制?

  参考答案:

没有限制

  [填空题]15什么时候需要在程序中创建内存池?

  参考答案:

用户自己创建的数据线程,则需要创建该线程的内存池

  [填空题]16如何使用Xcode设计通用应用?

  参考答案:

使用MVC模式设计应用,其中Model层完成脱离界面,即在Model层,其是可运行在任何设备上,在controller层,根据iPhone与iPad(独有UISplitViewController)的不同特点选择不同的viewController对象。

在View层,可根据现实要求,来设计,其中以xib文件设计时,其设置其为universal。

  [填空题]17在iPhone应用中如何保存数据?

  参考答案:

有以下几种保存机制:

  1).通过web服务,保存在服务器上2).通过NSCoder固化机制,将对象保存在文件中3).通过SQlite或CoreData保存在文件数据库中

  [填空题]18什么是NSManagedObject模型?

  参考答案:

  NSManagedObject是NSObject的子类,也是coredata的重要组成部分,它是一个通用的类,实现了coredata模型层所需的基本功能,用户可通过子类化NSManagedObject,建立自己的数据模型。

  [填空题]19什么是谓词?

  参考答案:

谓词是通过NSPredicate,是通过给定的逻辑条件作为约束条件,完成对数据的筛选。

  [填空题]20多线程是什么?

  参考答案:

多线程是个复杂的概念,按字面意思是同步完成多项任务,提高了资源的使用效率,从硬件、操作系统、应用软件不同的角度去看,多线程被赋予不同的内涵,对于硬件,现在市面上多数的CPU都是多核的,多核的CPU运算多线程更为出色;从操作系统角度,是多任务,现在用的主流操作系统都是多任务的,可以一边听歌、一边写博客;对于应用来说,多线程可以让应用有更快的回应,可以在网络下载时,同时响应用户的触摸操作。

在iOS应用中,对多线程最初的理解,就是并发,它的含义是原来先做烧水,再摘菜,再炒菜的工作,会变成烧水的同时去摘菜,最后去炒菜。

  [填空题]21谈谈Object-C的内存管理方式及过程?

  参考答案:

  1).当你使用new,alloc和copy方法创建一个对象时,该对象的保留计数器值为

  1.当你不再使用该对象时,你要负责向该对象发送一条release或autorelease消息.这样,该对象将在使用寿命结束时被销毁.2).当你通过任何其他方法获得一个对象时,则假设该对象的保留计数器值为1,而且已经被设置为自动释放,你不需要执行任何操作来确保该对象被清理.如果你打算在一段时间内拥有该对象,则需要保留它并确保在操作完成时释放它.3).如果你保留了某个对象,你需要(最终)释放或自动释放该对象.必须保持retain方法和release方法的使用次数相等.更多内容请访问《睦霖题库》微信公众号

  [填空题]22C和obj-c如何混用?

  参考答案:

  1).obj-c的编译器处理后缀为m的文件时,可以识别obj-c和c的代码,处理mm文件可以识别obj-c,c,c++代码,但cpp文件必须只能用c/c++代码,而且cpp文件include的头文件中,也不能出现obj-c的代码,因为cpp只是cpp2).在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是问题3).在cpp中混用obj-c其实就是使用obj-c编写的模块是我们想要的。

  如果模块以类实现,那么要按照cppclass的标准写类的定义,头文件中不能出现obj-c的东西,包括#importcocoa的。

实现文件中,即类的实现代码中可以使用obj-c的东西,可以import,只是后缀是mm。

  如果模块以函数实现,那么头文件要按c的格式声明函数,实现文件中,c++函数内部可以用obj-c,但后缀还是mm或m。

  总结:

只要cpp文件和cppinclude的文件中不包含obj-c的东西就可以用了,cpp混用obj-c的关键是使用接口,而不能直接使用实现代码,实际上cpp混用的是obj-c编译后的o文件,这个东西其实是无差别的,所以可以用。

obj-c的编译器支持cpp

  [填空题]23什么时候用delegate,什么时候用Notification?

  参考答案:

  delegate针对one-to-one关系,用于sender接受到reciever的某个功能反馈值。

  notification针对one-to-one/many/none,reciver,用于通知多个object某个事件。

  [填空题]24一个参数既可以是const还可以是volatile吗?

一个指针可以是volatile吗?

解释为什么。

  参考答案:

  1).是的。

一个例子是只读的状态寄存器。

它是volatile因为它可能被意想不到地改变。

它是const因为程序不应该试图去修改它。

  2).是的。

尽管这并不很常见。

一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。

  [填空题]25简述线程与进程的区别和联系?

  参考答案:

  1)进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性2)进程和线程的主要差别在于它们是不同的操作系统资源管理方式。

  3)进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。

  4)线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉。

所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。

  5)但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

  [填空题]26自动释放池是什么,如何工作?

  参考答案:

当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放.它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。

当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。

  [填空题]27sprintf,strcpy,memcpy使用上有什么要注意的地方。

  参考答案:

  1)sprintf是格式化函数。

将一段数据通过特定的格式,格式化到一个字符串缓冲区中去。

sprintf格式化的函数的长度不可控,有可能格式化后的字符串会超出缓冲区的大小,造成溢出。

  2)strcpy是一个字符串拷贝的函数,它的函数原型为strcpy(char*dst,constchar*src将src开始的一段字符串拷贝到dst开始的内存中去,结束的标志符号为‘/0’,由于拷贝的长度不是由我们自己控制的,所以这个字符串拷贝很容易出错。

  3)memcpy是具备字符串拷贝功能的函数,这是一个内存拷贝函数,它的函数原型为memcpy(char*dst,constchar*src,unsignedintlen);将长度为len的一段内存,从src拷贝到dst中去,这个函数的长度可控。

但是会有内存叠加的问题。

  [填空题]28简述http和scoket通信的区别。

  参考答案:

  http是客户端用http协议进行请求,发送请求时候需要封装http请求头,并绑定请求的数据,服务器一般有web服务器配合(当然也非绝对)。

  http请求方式为客户端主动发起请求,服务器才能给响应,一次请求完毕后则断开连接,以节省资源。

服务器不能主动给客户端响应(除非采取http长连接技术)。

iphone主要使用类是NSUrlConnection。

  scoket是客户端跟服务器直接使用socket“套接字”进行连接,并没有规定连接后断开,所以客户端和服务器可以保持连接通道,双方都可以主动发送数据。

一般在游戏开发或股票开发这种要求即时性很强并且保持发送数据量比较大的场合使用。

主要使用类是CFSocketRef。

  [填空题]29你了解svn,cvs等版本控制工具么?

  参考答案:

版本控制svn,cvs是两种版控制的器,需要配套相关的svn,cvs服务器。

  scm是xcode里配置版本控制的地方。

版本控制的原理就是a和b同时开发一个项目,a写完当天的代码之后把代码提交给服务器,b要做的时候先从服务器得到最新版本,就可以接着做。

  如果a和b都要提交给服务器,并且同时修改了同一个方法,就会产生代码冲突,如果a先提交,那么b提交时,服务器可以提示冲突的代码,b可以清晰的看到,并做出相应的修改或融合后再提交到服务器。

  [填空题]30什么是沙盒模型?

哪些操作是属于私有api范畴?

  参考答案:

某个iphone工程进行文件操作有此工程对应的指定的位置,不能逾越。

  iphone沙箱模型的有四个文件夹documents,tmp,app,Library,永久数据存储一般放documents文件夹,得到模拟器的路径的可使用NSHomeDirectory()方法。

Nsuserdefaults保存的文件在tmp文件夹里。

  [填空题]31请简要说明viewDidLoad和viewDidUnload何时调用?

  参考答案:

  viewDidLoad在view从nib文件初始化时调用,loadView在controller的view为nil时调用。

此方法在编程实现view时调用,view控制器默认会注册memorywarningnotification,当viewcontroller的任何view没有用的时候,viewDidUnload会被调用,在这里实现将retain的viewrelease,如果是retain的IBOutletview属性则不要在这里release,IBOutlet会负责release。

  [填空题]32HTTP协议中,POST和GET的区别是什么?

  参考答案:

  1).GET方法GET方法提交数据不安全,数据置于请求行,客户端地址栏可见;

  GET方法提交的数据大小有限GET方法不可以设置书签2).POST方法POST方法提交数据安全,数据置于消息主体内,客户端不可见POST方法提交的数据大小没有限制POST方法可以设置书签

  [填空题]33简述控件主要响应3种事件

  参考答案:

  1)基于触摸的事件;

  2).基于值的事件;

  3).基于编辑的事件。

  [填空题]34简述视图控件器的生命周期。

  参考答案:

  loadView尽管不直接调用该方法,如多手动创建自己的视图,那么应该覆盖这个方法并将它们赋值给试图控制器的view属性。

  viewDidLoad只有在视图控制器将其视图载入到内存之后才调用该方法,这是执行任何其他初始化操作的入口。

  viewDidUnload当试图控制器从内存释放自己的方法的时候调用,用于清楚那些可能已经在试图控制器中创建的对象。

  viewVillAppear当试图将要添加到窗口中并且还不可见的时候或者上层视图移出图层后本视图变成顶级视图时调用该方法,用于执行诸如改变视图方向等的操作。

实现该方法时确保调用[super

  viewWillAppear:

  [填空题]35xib文件的构成分为哪3个图标?

都具有什么功能。

  参考答案:

  File’sOwner是所有nib文件中的每个图标,它表示从磁盘加载nib文件的对象;

  FirstResponder就是用户当前正在与之交互的对象;

  View显示用户界面;完成用户交互;是UIView类或其子类。

  [填空题]36简述iOS的系统架构

  参考答案:

iOS的系统架构分为(核心操作系统层theCoreOSlayer)、(核心服务层theCoreServiceslayer)、(媒体层theMedialayer)和(Cocoa界面服务层theCocoaTouchlayer)四个层次。

  [填空题]37队列和栈有什么区别?

  参考答案:

队列和栈是两种不同的数据容器。

从”数据结构”的角度看,它们都是线性结构,即数据元素之间的关系相同。

  队列是一种先进先出的数据结构,它在两端进行操作,一端进行入队列操作,一端进行出列队操作。

  栈是一种先进后出的数据结构,它只能在栈顶进行操作,入栈和出栈都在栈顶操作。

  [填空题]38简述内存分区情况

  参考答案:

  1).代码区:

存放函数二进制代码2).数据区:

系统运行时申请内存并初始化,系统退出时由系统

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 成人教育 > 成考

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2