iPhone SDK Nonatomic and Atomic
真正的快速和简单的问题:是什么在Objective - C的无原子和原子之间的差异?当declaring样样性质的""(,,等,保持物业)对象"?
非原子保留getter和setter的代码在概念上类似于:
1 2 3 4 5 6 7 8 9 10 11 | -(id) foo { return fooIvar; } -(void) setFoo: (id) newFoo { [newFoo retain]; [fooIvar release]; fooIvar = newFoo; } |
原子getter和setter的代码在概念上如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | -(id) foo { @synchronized(self) { return [[fooIvar retain] autorelease]; } } -(void) setFoo: (id) newFoo { @synchronized(self) { [newFoo retain]; [fooIvar release]; fooIvar = newFoo; } } |
实现细节是不同的,特别是锁定比同步对象和IVAR更轻。
在非原子情况和多线程环境中,您不能保证getter会给您一个有效的对象,因为在getter返回引用和保持引用(或执行其他任何操作)的调用方之间,另一个线程可以调用setter,释放该对象并可能解除对其的分配。
在原子的情况下,这是不可能发生的,因为getter在返回对象之前将其放入线程的自动释放池中。如果另一个线程调用setter并在调用方有机会保留它之前释放该对象,则无需考虑自动释放池的所有权。
非原子-无头,但不线程安全。