What's the difference between 'atomic' and non-atomic? [duplicate] What's the difference between 'atomic' and non-atomic? [duplicate] objective-c objective-c

What's the difference between 'atomic' and non-atomic? [duplicate]


Atomic properties are necessary in a reference counted multi threaded environment in order to stop objects from disappearing before a thread has a chance to retain them.

Consider the naive implementation of a get accessor:

@interface MyObject : NSObject {    id myPropertyIVar;}-(id) myProperty;@end@implementation MyObject-(id) myProperty{    return myPropertyIvar;}// other stuff@end

This is all fine except that if you release the instance of MyObject before retaining the returned value from -myProperty the returned value may well be deallocated. For this reason, it is safer to implement -myProperty like this:

-(id) myProperty{    return [[myPropertyIvar retain] autorelease];}

This is now completely safe in a single threaded environment.

Unfortunately, in a multithreaded environment there is a race condition. If the thread is interrupted at any time before the retain has incremented the retain count, either of the following will cause you to receive a garbage pointer:

  • the instance of MyObject is released and deallocated by another thread causing the ivar to be released and deallocated
  • myProperty is reassigned by another thread causing the old version to be released and deallocated

For this reason, all accesses to the property must be protected by a lock. The get accessor looks something like this.

-(id) myProperty{    // lock    return [[myPropertyIvar retain] autorelease];    // unlock}

The set accessor is similarly protected and so is the release in -dealloc


The Apple docs explain all this very well. To learn about properties, including their atomicity, read this page.