为了账号安全,请及时绑定邮箱和手机立即绑定

原子属性和非原子属性有什么区别?

原子属性和非原子属性有什么区别?

iOS
冉冉说 2019-05-31 16:43:07
原子属性和非原子属性有什么区别?做什么atomic和nonatomic财产申报中的意思?@property(nonatomic, retain) UITextField *userName;@property(atomic, retain) UITextField *userName;@property(retain) UITextField *userName;这三者在运作上有何分别?
查看完整描述

3 回答

?
慕斯王

TA贡献1864条经验 获得超2个赞

这在苹果的文献资料下面是一些实际发生的事情的例子。请注意,没有“原子”关键字,如果不指定“非原子”,则属性是原子的,但是显式地指定“原子”将导致错误。

//@property(nonatomic, retain) UITextField *userName;//Generates roughly- (UITextField *) userName {
    return userName;}- (void) setUserName:(UITextField *)userName_ {
    [userName_ retain];
    [userName release];
    userName = userName_;}

现在,原子变体稍微复杂一点:

//@property(retain) UITextField *userName;//Generates roughly- (UITextField *) userName {
    UITextField *retval = nil;
    @synchronized(self) {
        retval = [[userName retain] autorelease];
    }
    return retval;}- (void) setUserName:(UITextField *)userName_ {
    @synchronized(self) {
      [userName_ retain];
      [userName release];
      userName = userName_;
    }}

基本上,为了确保线程安全,原子版本必须使用锁,还需要将ref计数加在对象上(以及自动释放计数以平衡对象),以便保证调用方存在对象,否则,如果另一个线程正在设置该值,则会出现一个潜在的争用条件,从而导致ref计数下降到0。

实际上,根据属性是标量值还是对象,以及保留、复制、只读、非原子等交互作用,这些东西的工作方式有很多不同的变体。一般来说,属性合成器只知道如何为所有组合做“正确的事情”。


查看完整回答
反对 回复 2019-05-31
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

原子

  • 是默认行为。
  • 将确保当前进程在另一个进程访问变量之前由cpu完成。
  • 不是快速的,因为它确保了整个过程的完成。

非原子

  • 不是默认行为。
  • 更快(用于合成代码,也就是使用@Property和@合成创建的变量)
  • 非线程安全
  • 当两个不同的进程同时访问同一个变量时,可能会导致意外行为。


查看完整回答
反对 回复 2019-05-31
  • 3 回答
  • 0 关注
  • 860 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信