2010-10-15 128 views
0

你能描述返回已分配給調用者(且來電者應該釋放)的對象,並返回一個自動釋放對象的方法等的命名約定區別?你如何判斷你是否需要釋放一個對象?

如果您聲明具有retain屬性的屬性,是否需要在將屬性設置爲nil之前釋放該屬性?

@synthesize指令是做什麼的?

+0

你應該一般不會問一個三個問題。 「@綜合」問題與其他兩個無關。每個問題應該是一個問題,以便其他用戶可以搜索他們的問題,並找到他們的問題,而不必通過與其無關的其他問題。 – 2010-10-15 21:25:59

回答

1

Aaron在下面列出了內存分配的一個很好的來源。

關於@synthesize

假設你有一個屬性P,你必須做的是寫一個getter和爲它的制定者。有一些常見的方法,其中之一是當您設置該屬性並釋放舊值時保留該對象。 E.G:

- (void)setP:(PClass *)value 
{ 
    [value retain]; 
    [_pInstanceVariable release]; 
    _pInstanceVariable = value; 
} 

由於這是一個代碼很常見的一塊,編譯器可以爲您自動執行它,如果你指定的屬性聲明retain關鍵字,然後在你的實現做@synthesize。編譯器將生成上面提到的代碼,這意味着您的代碼將更加清潔,而且不會有繁瑣的重複部分。

同樣適用於干將真實的,除非你想要的東西複雜得多:

- (PClass *)p 
{ 
    return _pInstanceVariable; 
} 

@synthesize將做的工作

+2

這裏的setter實現在技術上是不正確的。在釋放實例變量之前,您始終需要保留傳遞給setter方法的值。如果你不這樣做,如果傳入的對象與已存儲在變量中的對象相同,則你的應用程序將崩潰。 – johnw188 2010-10-15 19:07:16

+0

你是對的約翰!感謝您的更正 – Nick 2010-10-18 18:10:50

3

apple documentation

你只釋放或自動釋放對象你自己。 如果使用名稱以「黃金」或「新」,或包含「複製」(例如,分配,NEWOBJECT,或mutableCopy),或者如果你向它發送一個retain消息的方法創建你需要一個對象的所有權。

您使用release或autorelease放棄對象的所有權。 autorelease的意思是「將來發送一條發佈消息」(瞭解何時會發布,參見「Autorelease Pools」)。

你的第二個問題是相關的。 @synthesize所做的就是爲您的實現文件生成其他方法。 @property的參數(nonatomic,retain)NSString * myString;定義生成的方法的行爲。例如,如果您將屬性聲明爲retain,則setMyString生成的方法將保留其參數。

非原子很重要,因爲默認情況下,屬性是線程安全的。如果您不需要線程安全性,則可以刪除存取方法中的大量開銷。

最後,保留產權的實現

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

所以,說self.myString =無有效釋放MyString的爲您服務。許多人主張使用self.property = nil來保留屬性,而不是[property release],儘管我認爲這只是個人偏好。

相關問題