nonatomic 和 atomic
atomic 并不是绝对线程安全,它能保证代码进入 getter 和 setter 方法的时候是安全的,但是并不能保证多线程的访问情况下是安全的,一旦出了 getter 和 setter 方法,其线程安全就要由程序员自己来把握,所以 atomic 属性和线程安全并没有必然联系。
nonatomic 特点
- 不会加锁
- 多线程给nonatomic属性赋值,是可能重复release而崩溃的
@interface NonatomicTest : NSObject |
atomic 特点
- 无差别加锁,及时是在非多线程环境下,加锁会损耗性能。
- 由于是原子操作,可以在多线程情况下不崩溃,但是无法保证业务正确。
为什么 atomic 可以在多线程环境下可以不崩溃而 nonatomic 会崩溃?
atomic 的底层实现是有加锁的,老版本是自旋锁,iOS10 开始是互斥锁,spinlock 底层实现改变了。
nonatomic 底层是没有加锁的, 多线程读写,资源抢夺就会崩,比如多线程给属性赋值,是可能重复 release 而崩溃的。
// objc4-779.1 |