nonatomic和atomic的区别

在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];
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容