文档介绍:IOS笔试题
Object-C 有多继承吗?没有的话用什么代替?
Cocoa中所有的类都是NSObject的子类,多继承在这里是用protocol委托代理来实现的,你不用去考虑繁琐的多继承,虚基类的概念,多态性在Objective-C中的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的。
请介绍一下 Object-C 的内存管理方式
,alloc和copy方法创建一个对象时,,,该对象将在使用寿命结束时被销毁
.
,则假设该对象的保留计数器值为1,而且已经被设置为自动释放,,则需要保留它并确保在操作完成时释放它.
,你需要(最终).
内存管理 autorelease、retain、copy、assign 的 set 方法和含义?
你初始化(alloc/init)的对象,你需要释放(release)它。例如:
NSMutableArray aArray = [[NSArray alloc] init];
后,需要[aArray release];
你retain或copy的,你需要释放它。例如:
[aArray retain]后,需要[aArray release];
被传递(assign)的对象,你需要斟酌的retain和release。例如:
obj2 = [[obj1 someMethod] autorelease];
对象2接收对象1的一个自动释放的值,或传递一个基本数据类型(NSInteger,NSString)时: 你或希望将对象2进行retain,以防止它在被使用之前就被自动释放掉。但是在retain后,一定要在适当的时候进行释放。
关于索引计数(Reference Counting)的问题
retain值 = 索引计数(Reference Counting)
NSArray对象会retain(retain值加一)任何数组中的对象。当NSArray被卸载(dealloc)的时候,所有数组中的对象会被执行一次释放(retain值减一)。不仅仅是NSArray,任何收集类(Collection Classes)都执行类似操作。例如NSDictionary,甚至UINavigationController。
Alloc/init建立的对象,索引计数为1。无需将其再次retain。
[NSArray array]和[NSDate date]等“方法”建立一个索引计数为1的对象,但是也是一个自动释放对象。所以是本地临时对象,那么无所谓了。如果是打算在全Class中使用的变量(iVar),则必须retain它。
缺省的类方法返回值都被执行了“自动释放”方法。(*如上中的NSArray)
在类中的卸载方法“dealloc”中,release所有未被平衡的NS对象。(*所有未被autorelease,而retain值为1的)
readwrite,readonly,assign,retain,copy,nonatomic 属性的作用,
定义属性时,什么情况使用 copy、assign、retain?
***@property是 一个属性访问声明,扩号内支持以下几个属性:
getter=getterName,setter=setterName,设置setter与 getter的方法名
readwrite,readonly,设置可供访问级别
assign,setter方法直接赋值,不进行 任何retain操作,为了解决原类型与环循引用问题
retain,setter方法对参数进行release旧值再retain新值,所有 实现都是这个顺序(CC上有相关资料)
copy,setter方法进行Copy操作,与retain处理流程一样,先旧值release,再 Copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制。
nonatomic,非原子性访问,不加同步, 多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级(我是这么理解的...)。
assign用于简单数据类型,如NSInteger,double,bool,
retain和copy用于对象,
cop