面试题答案
一键面试nonatomic
- 作用:表示非原子性访问,在多线程环境下,访问该属性不会使用互斥锁。相比
atomic
(默认修饰符,保证原子性访问,但性能稍低),nonatomic
性能更高。 - 适用场景:适用于对线程安全要求不高,追求更高性能的场景,如在单线程环境下的属性访问,或者对于一些不需要保证原子性操作的对象属性。
- 举例:
@property (nonatomic, strong) NSString *name;
strong
- 作用:强引用,持有对象,会增加对象的引用计数。当一个对象被强引用指向时,只要强引用存在,对象就不会被释放。
- 适用场景:一般用于需要自己管理对象生命周期,确保对象在使用过程中不被释放的情况,比如视图控制器中的视图属性。
- 举例:
@property (nonatomic, strong) UIView *customView;
在上述例子中,视图控制器持有 customView
的强引用,只要视图控制器存在,customView
就不会被释放。
weak
- 作用:弱引用,不持有对象,不会增加对象的引用计数。当对象的强引用计数为0被释放时,指向该对象的所有弱引用会自动被设置为
nil
,从而避免野指针。 - 适用场景:主要用于解决循环引用问题,比如视图控制器之间的父子关系,或者代理对象的声明。
- 举例:
@property (nonatomic, weak) id<SomeDelegateProtocol> delegate;
在代理模式中,使用弱引用可以防止代理对象和被代理对象之间形成循环引用。
copy
- 作用:对对象进行拷贝,创建一个新的对象副本,新副本与原对象引用计数相互独立。对于不可变对象(如
NSString
、NSArray
等),通常执行浅拷贝(只复制指针);对于可变对象,执行深拷贝(复制内容)。 - 适用场景:当你不希望属性的值被外部意外修改时使用,比如传递一个字符串属性,防止外部修改字符串内容影响内部逻辑。
- 举例:
@property (nonatomic, copy) NSString *text;
如果外部传递一个 NSMutableString
给 text
属性,使用 copy
修饰会创建一个不可变的 NSString
副本,从而保证 text
的内容不会被外部通过 NSMutableString
方法修改。