2009-11-02 54 views

回答

29

我認爲這是提請你注意的事實,正在使用assign,而不是retaincopy。由於NSString是一個對象,因此在引用計數的環境中(即沒有垃圾收集),這可能是潛在的「危險」(除非它是有意設計的)。

然而,assignretaincopy之間的區別如下:

  • 分配:在該屬性的setter方法,還有就是你的實例變量的簡單分配到新的價值例如:

    - (void)setString:(NSString*)newString 
    { 
        string = newString; 
    } 
    

    這可以通過不保留該對象會導致問題,因爲Objective-C對象使用引用計數,並且因此,有機會該字符串可以在您仍在使用時釋放。

  • 保留:此保留在setter方法的新值。例如:

    - (void)setString:(NSString*)newString 
    { 
        [newString retain]; 
        [string release]; 
        string = newString; 
    } 
    

    這是比較安全的,因爲你明確說明要保持對象的引用,你必須釋放它,它就會被釋放之前。

  • 副本:這使得該字符串的一個副本在你的setter方法:

    - (void)setString:(NSString*)newString 
    { 
        if(string!=newString) 
        { 
         [string release]; 
         string = [newString copy]; 
        } 
    } 
    

    這通常被用來處理字符串,因爲製作原始對象的副本,確保它不會改變,而你正在使用它。

10

Cocoa使用引用計數來管理內存。引用計數爲0的對象被刪除。

  • 分配 - 什麼都不做引用計數僅指向您的變量的數據
  • 保留 - 指向您的變量數據,並增加了1引用計數,保證數據在那裏,而你的變量仍然活着
  • 副本 - 讓數據的副本,點你的變量它,使保留計數1個

更多細節here,在蘋果自己的文檔。

+1

retain - __even if__ someone [deallocs]你正在引用的NSString?或者只有同一個實例的每個用戶[發佈]才能工作? – bobobobo 2009-11-02 18:23:43

+1

@bobobobo - 你應該*不要*調用'dealloc'自己。你應該總是使用'release'或'autorelease'。 – 2009-11-02 18:24:38

+0

戴夫說什麼。您的數據得到保證的原因是因爲您認爲其他人只使用版本,僅通過引用降低引用計數。如果其他人,或者你自己,通過dealloc或釋放一個對象(從而不遵守規則),你的數據不能保證! – bmalicoat 2009-11-02 18:28:48

3

assign - ivar通過做一個簡單的任務設置。執行:

- (void) setFoo:(NSString *)newFoo { 
    foo = newFoo; 
} 

retain - 伊娃在做任務之前發送的保留消息。執行:

- (void) setFoo:(NSString *)newFoo { 
    if (foo != newFoo) { 
    [foo release]; 
    foo = [newFoo retain]; 
    } 
} 

copy - ivar在進行分配前發送複製消息。實現:

- (void) setFoo:(NSString *)newFoo { 
    if (foo != newFoo) { 
    [foo release]; 
    foo = [newFoo copy]; 
    } 
} 
+1

這些不是實際實施方式中,編譯器@synthesizes,但是從(非GC)存儲器管理透視演示行爲。 – 2009-11-02 18:19:09

+0

@尼古拉 - 是的,謝謝澄清。 – 2009-11-02 18:22:32

相關問題