面试题答案
一键面试区别
- atomic:
- atomic 是默认的属性特质。它会为属性的 setter 和 getter 方法添加锁,以确保同一时间只有一个线程能够访问属性,从而保证了多线程环境下属性访问的线程安全性。
- 这种线程安全是通过锁机制实现的,每次访问属性时都要进行加锁和解锁操作,这会带来一定的性能开销。
- nonatomic:
- nonatomic 表示非原子性,它不会为属性的 setter 和 getter 方法添加锁。
- 这意味着在多线程环境下,不同线程可能同时访问和修改该属性,存在数据竞争的风险,但由于没有锁的开销,其性能相对 atomic 更好。
使用场景
- atomic:
- 当属性的值在多线程环境下频繁被读写,并且需要保证数据一致性和完整性时,使用 atomic。例如,在多线程同时读写共享数据的场景,如多线程操作数据库连接对象的某些属性时,为了防止数据不一致,可以使用 atomic。
- nonatomic:
- 在性能要求较高且不存在多线程竞争访问风险的场景下,使用 nonatomic。例如,在单例类中,因为单例在应用中只有一个实例,不存在多线程访问的竞争问题,其属性可以使用 nonatomic 以提高性能。另外,在一些只在主线程中访问的属性,也可以使用 nonatomic 来提升性能。