簡體   English   中英

iPhone SDK非原子和原子

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM