您的位置:首页 > 运维架构

Atomic vs nonatomic properties

2012-09-09 08:49 169 查看


Atomic vs
nonatomic properties






up
vote356down
votefavorite

189

What do 
atomic
 and 
nonatomic
 mean
in property declarations?
@property(nonatomic, retain) UITextField *userName;

@property(atomic, retain) UITextField *userName;

@property(retain) UITextField *userName;


What is the functional difference between these 3?

objective-c multithreading properties atomic
share|improve
this question
edited Feb
7 '11 at 14:35




kiamlaluno
7,77542637

asked Feb 26 '09 at 2:31




Alex Wayne
28.7k84994

89% accept rate
 
4 
Updating the url from Apple's documentation:developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/… – JackDaniels Aug
3 '11 at 19:10
feedback


9 Answers

activeoldestvotes

up
vote454down
voteaccepted
The last two are identical; "atomic" is the default behavior (note that it is not actually a keyword; it is specified only by the absence of 
nonatomic
).

Assuming that you are @synthesizing the method implementations, atomic vs. non-atomic changes the generated code. If you are writing your own setter/getters, atomic/nonatomic/retain/assign/copy are merely advisory.

With "atomic", the synthesized setter/getter will ensure that a whole value is always returned from the getter or set by the setter, regardless of
setter activity on any other thread. That is, if thread A is in the middle of the getter while thread B calls the setter, an actual viable value -- an autoreleased object, most likely -- will be returned to the caller in A.

In 
nonatomic
,
no such guarantees are made. Thus, 
nonatomic
 is
considerably faster than "atomic".

What "atomic" does not do is make any guarantees about thread safety. If thread A is calling the getter simultaneously with thread B and C calling
the setter with different values, thread A may get any one of the three values returned -- the one prior to any setters being called or either of the values passed into the setters in B and C. Likewise, the object may end up with the value from B or C, no
way to tell.

Ensuring data integrity -- one of the primary challenges of multi-threaded programming -- is achieved by other means.

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息