我在宣佈一個NSString屬性的類和Objective-C的抱怨:的NSString沒有「分配」,「保留」或「複製」屬性指定
的NSString沒有「分配」,「保留「或」複製「屬性被指定爲
然後隨便讓我知道」分配被用來代替「。
有人能向我解釋之間的差額分配,在普通的C內存管理功能方面保留和副本?
我在宣佈一個NSString屬性的類和Objective-C的抱怨:的NSString沒有「分配」,「保留」或「複製」屬性指定
的NSString沒有「分配」,「保留「或」複製「屬性被指定爲
然後隨便讓我知道」分配被用來代替「。
有人能向我解釋之間的差額分配,在普通的C內存管理功能方面保留和副本?
我認爲這是提請你注意的事實,正在使用assign
,而不是retain
或copy
。由於NSString
是一個對象,因此在引用計數的環境中(即沒有垃圾收集),這可能是潛在的「危險」(除非它是有意設計的)。
然而,assign
,retain
和copy
之間的區別如下:
分配:在該屬性的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];
}
}
這通常被用來處理字符串,因爲製作原始對象的副本,確保它不會改變,而你正在使用它。
Cocoa使用引用計數來管理內存。引用計數爲0的對象被刪除。
更多細節here,在蘋果自己的文檔。
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];
}
}
這些不是實際實施方式中,編譯器@synthesizes,但是從(非GC)存儲器管理透視演示行爲。 – 2009-11-02 18:19:09
@尼古拉 - 是的,謝謝澄清。 – 2009-11-02 18:22:32
retain - __even if__ someone [deallocs]你正在引用的NSString?或者只有同一個實例的每個用戶[發佈]才能工作? – bobobobo 2009-11-02 18:23:43
@bobobobo - 你應該*不要*調用'dealloc'自己。你應該總是使用'release'或'autorelease'。 – 2009-11-02 18:24:38
戴夫說什麼。您的數據得到保證的原因是因爲您認爲其他人只使用版本,僅通過引用降低引用計數。如果其他人,或者你自己,通過dealloc或釋放一個對象(從而不遵守規則),你的數據不能保證! – bmalicoat 2009-11-02 18:28:48