非常快速和简单的问题:在 Objective-C 中,非原子和原子之间有什么区别?就像声明“@property(非原子,保留)id 对象”这样的属性时?
最佳答案
非原子保留 getter 和 setter 的代码在概念上类似于:
-(id) foo
{
return fooIvar;
}
-(void) setFoo: (id) newFoo
{
[newFoo retain];
[fooIvar release];
fooIvar = newFoo;
}
原子 getter 和 setter 的代码在概念上看起来像这样:
-(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 并在调用者有机会保留该对象之前释放该对象,则由于自动释放池拥有所有权,因此这并不重要。
关于iPhone SDK 非原子和原子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3623649/