1 / 47
文档名称:

iOS面试题及答案.docx

格式:docx   大小:209KB   页数:47页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

iOS面试题及答案.docx

上传人:w447750 2017/10/19 文件大小:209 KB

下载得到文件列表

iOS面试题及答案.docx

文档介绍

文档介绍:面试题
Object-c的类可以多继承么?category是什么?重写一个类的方式用继承好还是分类好?为什么?
答:Object-c的类不可以多重继承,可以用伪继承和***@protocol委托来代替;可以实现多个接口,通过实现多个接口就可以完成C++的多重继承,Category是类别,一般用分类比较好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系。
伪继承必须覆盖两个方法,即methodSignatureForSelector: 和 forwardInvocation:。methodSignatureForSelector:的作用在于为另一个类实现的消息创建一个有效的方法签名。forwardInvocation:将选择器转发给一个真正实现了该消息的对象.
类别的作用?继承和类别在实现中有何区别?
答:category可以在不获悉,不改变原来代码的情况下往里面添加新的方法, 只能添加,不能删除修改。并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。
类别主要有3个作用:(1)将类的实现分散到多个不同文件或多个不同框架中。(2)创建对私有方法的前向引用。(3)向对象添加非正式协议。继承可以增加,修改或者删除方法,并且可以增加属性。

/* 非正式协议:是使用类别category来实现,非正式协议是NSObject的一个类别,这样任何类的对象都可以作为委托对象来使用,它可以列出对象能够执行的所有方法,这样用来实现委托, 我们可以使用选择器来判断该非正式协议中是否有这个方法。
正式协议:是一个命名的方法列表,与非正式协议相比不同的是,它要求显示的采用协议,采用协议的方法是在类的***@interface声明中列出协议的名称,此时,实现协议的类应该遵守协议,承诺实现协议中的所有方法。*/
类别和类扩展的区别?
答:1."类别"比"子类"方便多了,因为对已添加category的类,使用到它或者它的子类的地方,category都会起作用;“子类”的话,则需要在使用的每个地方,创建子类对象
2."类别"只能添加方法,不能加属性、变量
3."类别"一般是对框架提供类的扩展(没有源码,不能修改)
4."类别"一般是在不想生成一个新的子类的情况下,比如对NSArray的扩展
“扩展”则相当于定义一个子类,在里面添加属性和方法
属性readwrite,readonly,assign,retain,copy,nonatomic各是什么作用,在哪种情况下用?什么情况使用weak关键字,相比assign有什么不同?
答:1> readwrite:同时生成get方法和set方法的声明和实现
2> readonly:只生成get方法的声明和实现
3> assign:set方法的实现是直接赋值,用于基本数据类型
4> retain:set方法的实现是release旧值,retain新值,用于OC对象类型
5> copy:set方法的实现是release旧值,copy新值,用于NSString、block等类型
6> nonatomic:非原子性,set方法的实现不加锁(比atomic性能高)
注意点:(nonatomic)非原子性访问,对属性赋值的时候不加锁,多线程并发访问会提高性能。如果不加此属性,则默认是两个访问方法都为原子型事务访问。(atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。
写一个setter方法用于完成***@property(nonatomic,retain)NSString * name,写一个setter方法用于完成***@property(nonatomic,copy)NSString * name;
答:- (void)setName:(NSString *) str  
{  
    [str retain];  
    [name release];  
    name = str;  
}  
- (void)setName:(NSString *)str  
{  
    id t = [str copy];  
    [name release];  
    name = t;  
}  
看下面的程序,第一个NSLog会输出什么?这时str的retaincount是多少?第二个和第三个呢?为什么?
NSMutableArray * ary = [[NSMutableArra