真正快速而简单的问题:在Objective-C中,非原子和原子有什么区别?比如声明像“@property(nonatomic,retain)id object”这样的属性?
答案 0 :(得分:5)
非原子保留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返回引用和调用者之间保留它(或做其他任何事情)另一个线程可以调用安装者,释放物体并可能解除分配。
在原子情况下,这不可能发生,因为getter在返回之前将对象放入线程的自动释放池中。如果另一个线程调用setter并在调用者有机会保留它之前释放该对象,则由于autorelease池拥有所有权而无关紧要。
答案 1 :(得分:2)
非原子 - 少于头但不是线程安全。