面试题答案
一键面试nonatomic 和 atomic 的区别
- 线程安全性:
- atomic:默认情况下,属性声明为
atomic
,它会自动生成线程安全的访问器方法。这意味着在多线程环境下,对属性的读写操作是原子性的,同一时间只有一个线程可以访问属性,以防止数据竞争问题。例如,在一个多线程环境中多个线程同时读写atomic
属性时,不会出现数据不一致的情况。 - nonatomic:该关键字表示属性的访问器方法不是线程安全的。在多线程环境下,多个线程同时访问和修改
nonatomic
属性可能会导致数据竞争,进而出现数据不一致的问题。不过,由于nonatomic
没有线程同步的开销,所以访问速度比atomic
更快。
- atomic:默认情况下,属性声明为
- 性能:
- atomic:因为要保证线程安全,需要额外的同步机制(如锁),这会带来一定的性能开销。特别是在频繁读写属性的场景下,性能影响更为明显。
- nonatomic:没有线程同步的开销,所以在单线程环境或者对线程安全要求不高的多线程环境中,访问速度更快,性能更好。
适用场景
- 使用 nonatomic 的场景:
- 单线程环境:如果整个应用程序是单线程的,不存在多线程并发访问的问题,那么使用
nonatomic
可以提高性能,因为无需额外的线程同步开销。例如,一个简单的命令行工具应用,只在主线程执行任务,属性声明为nonatomic
即可。 - 多线程环境但对线程安全要求不高:当在多线程环境中,即使偶尔出现数据不一致也不会对程序造成严重影响时,可以使用
nonatomic
。比如,应用程序中的一些非关键数据,如用户界面上的一些统计信息展示(即使数据偶尔不准确也不影响核心功能),属性可以声明为nonatomic
以提高性能。
- 单线程环境:如果整个应用程序是单线程的,不存在多线程并发访问的问题,那么使用
- 使用 atomic 的场景:
- 多线程环境且对数据一致性要求严格:当在多线程环境下,属性的数据一致性非常关键,不允许出现数据竞争导致的数据不一致情况时,应使用
atomic
。例如,银行转账操作中涉及的账户余额属性,必须保证在多线程并发访问时数据的准确性,此时属性声明为atomic
,以确保任何时候对余额的读写都是原子性的,避免出现错误的转账结果。
- 多线程环境且对数据一致性要求严格:当在多线程环境下,属性的数据一致性非常关键,不允许出现数据竞争导致的数据不一致情况时,应使用