[英]nonatomic property in model class when using NSOperationQueue (iPhone)?
[英]iPhone SDK Nonatomic and Atomic
真正簡單的問題:在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並在調用者有機會保留它之前釋放了該對象,則由於自動釋放池具有所有權而沒有關系。
非原子的-開銷少,但不是線程安全的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.