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

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

做什么atomic和nonatomic财产申报中的意思?


@property(nonatomic, retain) UITextField *userName;

@property(atomic, retain) UITextField *userName;

@property(retain) UITextField *userName;

这三者在运作上有何分别?


冉冉说
浏览 861回答 3
3回答

慕斯王

这在苹果的文献资料下面是一些实际发生的事情的例子。请注意,没有“原子”关键字,如果不指定“非原子”,则属性是原子的,但是显式地指定“原子”将导致错误。//@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。实际上,根据属性是标量值还是对象,以及保留、复制、只读、非原子等交互作用,这些东西的工作方式有很多不同的变体。一般来说,属性合成器只知道如何为所有组合做“正确的事情”。

眼眸繁星

原子是默认行为。将确保当前进程在另一个进程访问变量之前由cpu完成。不是快速的,因为它确保了整个过程的完成。非原子不是默认行为。更快(用于合成代码,也就是使用@Property和@合成创建的变量)非线程安全当两个不同的进程同时访问同一个变量时,可能会导致意外行为。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

iOS