Saturday, June 19, 2010

Objective-C properties: atomic vs nonatomic



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?

Answers:

The last two are identical; 'atomic' is the default behavior.
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.
Regards
dinesh 

1 comment:

  1. http://stackoverflow.com/questions/588866/atomic-vs-nonatomic-properties

    ReplyDelete