MST

星途 面试题库

面试题:Objective-C类定义与声明中的属性修饰符

在Objective-C中,类的属性常用的修饰符有哪些,例如nonatomic、strong、weak、copy等,分别阐述它们的作用及适用场景,并举例说明。
21.7万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

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

  • 作用:对对象进行拷贝,创建一个新的对象副本,新副本与原对象引用计数相互独立。对于不可变对象(如 NSStringNSArray 等),通常执行浅拷贝(只复制指针);对于可变对象,执行深拷贝(复制内容)。
  • 适用场景:当你不希望属性的值被外部意外修改时使用,比如传递一个字符串属性,防止外部修改字符串内容影响内部逻辑。
  • 举例
@property (nonatomic, copy) NSString *text;

如果外部传递一个 NSMutableStringtext 属性,使用 copy 修饰会创建一个不可变的 NSString 副本,从而保证 text 的内容不会被外部通过 NSMutableString 方法修改。