当讨论到property多线程安全的时候,很多人都知道给property加上atomic attribute之后,可以一定程度的保障多线程安全。
但是这个其实是存在误区的,设置atomic后,只是默认的生成getter和setter方法执行是原子的,只能保证多线程中执行getter和setter方法是线程安全的,但是实际上很多时候是执行getter后需要对变量做处理,这个时候就会出问题。
两个线程访问同一个atomic修饰的属性上面这段代码就会出现闪退,因为self.atomicProperty.length是原子的,这个时候如果是@“1234567890”,进入到if中后,值可能会变为@“123”,导致闪退。
为了避免上面这种多线程访问和写入的问题,如果访问只是简单的访问时,可以用一个局部变量接收一下,或者通过代码块加锁的方式来避免,如下:
通过局部变量接收 通过加锁方式不过由于atomic速度不快,所以如果不会多线程中操作的话,尽量还是使用nonatomic修饰。
另外之前看到有人问:系统默认的是atomic的,为什么大多时候都是使用nonatomic?
看到有个大神的解释是:理论上如果没有特殊要求的话,iOS用nonatomic比较好,而OSX用atomic比较好。如果不写的话,系统按照相对比较安全的atomic处理。iOS用nonatomic主要是出于性能考虑,OSX上性能不是瓶颈,所以就不用了。
网友评论