美文网首页
atomic 和 nonatomic 有什么区别?

atomic 和 nonatomic 有什么区别?

作者: 可爱的活火山 | 来源:发表于2017-06-03 10:36 被阅读32次

    常见场景

    在定义 property 的时候,atomic和nonatomic有何区别?

    1.@property(nonatomic, retain) UITextField *userName;

    2.@property(atomic, retain) UITextField *userName;

    3.@property(retain) UITextField *userName;

    答案:2,3行是一样的,不写的话默认就是atomic。atomic 和 nonatomic 的区别在于,系统自动生成的 getter/setter 方法不一样。如果你自己写 getter/setter,那 atomic/nonatomic/retain/assign/copy 这些关键字只起提示作用,写不写都一样。对于atomic的属性,系统生成的 getter/setter 会保证 get、set 操作的完整性,不受其他线程影响。比如,线程 A 的 getter 方法运行到一半,线程 B 调用了 setter:那么线程 A 的 getter 还是能得到一个完好无损的对象。不过atomic可并不能保证线程安全。如果线程 A 调了 getter,与此同时线程 B 、线程 C 都调了 setter——那最后线程 A get 到的值,3种都有可能:可能是 B、C set 之前原始的值,也可能是 B set 的值,也可能是 C set 的值。同时,最终这个属性的值,可能是 B set 的值,也有可能是 C set 的值。

    代码回答:

    //@property(nonatomic, retain) UITextField *userName;

    //系统生成的代码如下:

    - (UITextField *)userName {   

     return userName;

    }

    - (void)setUserName:(UITextField *)userName_ {   

     [userName_ retain];   

     [userName release];

    userName =userName_;

    }

    @property(retain) UITextField *userName;

    //系统生成的代码如下:

    - (UITextField*) userName {

    UITextField*retval =nil;

    @synchronized(self)

       {        

         retval = [[userName  retain]  autorelease];    

       }

    return  retval;

    }

    - (void) setUserName:(UITextField*)userName_ {

        @synchronized(self) {      

         [userName release];     

          userName = [userName_  retain];    

         }

    }

    相关文章

      网友评论

          本文标题:atomic 和 nonatomic 有什么区别?

          本文链接:https://www.haomeiwen.com/subject/riclattx.html