继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

iOS 属性关键字atomic和nonatomic

ZKReadStone
关注TA
已关注
手记 52
粉丝 32
获赞 322

atomic是原子性的,nonatomic是非原子性的

atomic原子性并不能保证多线程安全,只是能保证数据的完整性

这个完整性体现在:使用者总能取到完整的值

例如以atomic修饰的属性name,A线程getter,B、C线程setter

这个name就有可能是B、C之前的初始name,也可能是B线程操作后的bName,也可能是C线程操作后的cName

nonatomic修饰的属性name的setter


-(void)setName:(NSString *)name
{
    if (_name != name) {
        [_name release];
        //非原子性的getter可能不完整就出现在这里
        _name = [name retain];
    }
}

可能不完整指的就是在A线程setter时,b线程在上面的注释位置的时机getter,此时_name 释放掉了,可能取不到对象

###此时再说atomic的

-(void)setName:(NSString *)name
{
   @synchronized(self) {
       if (_name != name) {
           [_name release];
           _name = [name retain];
       }
   }
}

这里就跟nonatomic不一样了,setter中name不能被其他线程操作,所以肯定是完整的name,但是多线程不能保证具体取到的是哪个线程设置的值。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP