面试题答案
一键面试nonatomic与atomic
- 内存管理:两者在内存管理上没有直接关联,它们主要影响属性访问的方式。
- 线程安全:
- atomic:默认属性,提供原子性操作,保证同一时间只有一个线程能访问属性,在多线程环境下,对属性的读写是线程安全的。但这种线程安全只保证了getter和setter方法的原子性,对于复杂操作(如先读取再修改),仍需额外同步机制。
- nonatomic:不提供原子性操作,在多线程环境下访问属性可能会出现数据竞争问题,但因其没有原子性操作的开销,访问速度更快,适用于单线程环境或对线程安全要求不高的场景。
strong
- 内存管理:表示强引用,持有对象。当一个对象被一个strong类型的属性引用时,对象的引用计数会增加。只有当所有指向该对象的strong引用都被释放后,对象的引用计数降为0,对象才会被释放。
- 线程安全:本身不提供线程安全机制,在多线程环境下使用时,若涉及多个线程对该属性的访问和修改,需额外的同步措施。
weak
- 内存管理:表示弱引用,不会增加对象的引用计数。当对象的所有强引用都被释放后,对象被释放,指向该对象的所有弱引用会自动被设置为nil,从而避免野指针的产生。常用于解决循环引用问题,比如视图控制器之间的父子关系,子视图控制器对父视图控制器使用weak引用。
- 线程安全:本身不提供线程安全机制,在多线程环境下使用时,若涉及多个线程对该属性的访问和修改,需额外的同步措施。
copy
- 内存管理:用于修饰不可变对象类型的属性(如NSString、NSArray、NSDictionary等)。当设置属性值时,会对传入的对象进行拷贝,生成一个新的对象,新对象的引用计数为1,由当前对象持有。这样可以确保属性值不会被外部修改,保证数据的完整性。例如,若一个NSString属性使用copy修饰,当外部传入一个可变的NSMutableString对象时,会拷贝一份不可变的NSString对象给属性,即使外部的NSMutableString对象后续发生变化,也不会影响到属性值。
- 线程安全:本身不提供线程安全机制,在多线程环境下使用时,若涉及多个线程对该属性的访问和修改,需额外的同步措施。
assign
- 内存管理:用于基本数据类型(如NSInteger、CGFloat、BOOL等)和C数据类型。它直接赋值,不涉及对象的引用计数管理。对于对象类型,不推荐使用assign,因为对象释放后,指向该对象的assign类型指针不会被自动置为nil,会产生野指针。
- 线程安全:本身不提供线程安全机制,在多线程环境下使用时,若涉及多个线程对该属性的访问和修改,需额外的同步措施。