atomic 和 nonatomic的区别

原子性和非原子性的区别

两个关键字修饰的OC对象,系统都会自动生成setter/getter方法,区别就在于一个会进行加锁操作,一个不会。系统默认是使用atomic的。

因为atomic做了线程锁,所以理论上讲atomic是要比nonatomic更加耗费性能,更慢。理论上如果没有特殊要求的话,iOS用nonatomic比较好,而OSX用atomic比较好。如果不写,系统按照相对比较安全的atomic处理。iOS用nonatomic主要是出于性能考虑,OSX上性能不是瓶颈,所以就不用了。

atomic系统会在生成的setter/getter方法里加锁,但是这个锁仅仅是保证了setter/getter存取的安全,并不能保证数据结果正确。

例如:

A线程执行setter方法到一半的时候,B线程执行getter方法,那么B线程执行getter方法,那么B线程的getter方法会被阻塞,等到setter方法执行完成之后才能取到值。这里系统使用的也是@synchronized.

 

A,B,C等多个线程都要操作同一个对象setter,D线程要getter这个对象的值,那么每一线程都成保证各自数据的完整性,但是D线程最后get到的值并不能确定。

 

以上,所以atomic能够保证数据的完成性,也就是说他只是读写安全,并不能准确定义它是线程安全的。因为线程可以对数据做很多操作,包括读写,还有release,retain,假如说对一个已经释放的对象进行release,就会导致crash。

 

by the way

@synthesize和dynamic的区别

@synthesize var= _var是默认的,如果你没有手动实现setter/getter方法,那么编译器就会自动给你加上这两个方法

atomic关键字实现setter/getter方法如下

@dynamic则是告诉编译器,用户自己去实现setter/getter方法,但是如果你这么申明了,最后却没有手动去实现,那么编译可能是没问题的,但是最后程序执行到obj.var = svar的时候,会因为找不到方法而crash.

转自:https://www.jianshu.com/p/67808752b0b4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值