面试题答案
一键面试retain
- 语义特性:当使用
retain
关键字声明属性时,在设置属性值时,会发送retain
消息给新值,使新值的引用计数加1;同时会向旧值发送release
消息,使其引用计数减1。这样做可以确保对象在被使用时不会被意外释放,当引用计数为0时,对象会被销毁。
assign
- 语义特性:
assign
用于简单数据类型(如基本数据类型int
、float
等)和对对象的弱引用(在非ARC环境下)。对于对象类型,它只是简单地赋值,不会增加或减少对象的引用计数。这就意味着如果对象被释放,指向它的assign
类型属性将成为悬空指针,访问该指针会导致程序崩溃。
copy
- 语义特性:
copy
关键字会创建一个新的对象副本,并将该副本赋值给属性。对于不可变对象(如NSString
、NSArray
等),copy
操作实际上是retain
操作,因为创建新副本的开销较大,直接retain
原对象更高效;对于可变对象(如NSMutableString
、NSMutableArray
等),copy
会创建一个新的不可变副本。这样可以保证对象的值不会被意外修改,因为副本和原对象是相互独立的。
对于指向可变对象的属性选择
- 优先选择:从内存管理和对象一致性角度考虑,应该优先选择
copy
关键字来声明指向可变对象的属性。 - 原因:如果使用
retain
,属性指向的是可变对象本身,外部对该可变对象的修改会直接影响到属性的值,可能导致对象状态不一致。而使用copy
,属性指向的是可变对象的不可变副本,即使外部修改了原可变对象,属性值也不会改变,从而保证了对象内部状态的一致性。同时,copy
也有助于内存管理,它创建了独立的副本,避免了因共享对象带来的潜在内存问题。