美文网首页
nonatomic和atomic的区别

nonatomic和atomic的区别

作者: 堂吉诃德灬 | 来源:发表于2017-06-26 21:10 被阅读23次

在iOS中,如果一个属性没有声明是nonatomic还是atomic,那么它默认是atomic。

nonatomic不保证原子性,当一个属性声明为nonatomic的时候,访问这个属性的时候速度会很快,但是这个属性不是线程安全的,同时如果一个线程在访问属性的get方法,另外一个线程在访问属性的set方法,那么如果set方法没有调用完成,get方法获得的值可能是错误的

atomic是属性默认的,它的速度并不快,因为在它的内部加入了锁来保证set活着get方法的完整性,比如一个线程在调用set方法的时候另外一个线程的get方法必须等待当前线程的set方法调用完毕之后才能调用。atomic虽然保证的set和get方法的完整性,但是它并不是线程安全的,因为atomic只是保证了读写方法的完整性,但是一个属性除了读写方法还有另外的方法,比如release,所以nonatomic和atomic的区别就是在于set和get方法的区别

代码

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

- (UITextField *) userName {
    return userName;
}

- (void) setUserName:(UITextField *)userName_ {
    [userName_ retain];
    [userName release];
    userName = userName_;
}
//atomic系统生成的代码如下:
- (UITextField *) userName {
    UITextField *retval = nil;
    @synchronized(self) {
        retval = [[userName retain] autorelease];
    }
    return retval;
}

- (void) setUserName:(UITextField *)userName_ {
    @synchronized(self) {
      [userName release];
      userName = [userName_ retain];
    }
}

相关文章

网友评论

      本文标题:nonatomic和atomic的区别

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