【发布时间】:2010-09-02 03:32:29
【问题描述】:
真正快速而简单的问题:在 Objective-C 中,非原子和原子之间有什么区别?比如在声明“@property (nonatomic, retain) id object”之类的属性时?
【问题讨论】:
-
我见过的最佳答案:stackoverflow.com/questions/588866/…
标签: iphone objective-c variables
真正快速而简单的问题:在 Objective-C 中,非原子和原子之间有什么区别?比如在声明“@property (nonatomic, retain) id object”之类的属性时?
【问题讨论】:
标签: iphone objective-c variables
非原子保留 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 并释放了该对象,这无关紧要,因为自动释放池拥有所有权。
【讨论】:
非原子 - 开销较小但不是线程安全的。
【讨论】: