你能描述返回已分配給調用者(且來電者應該釋放)的對象,並返回一個自動釋放對象的方法等的命名約定區別?你如何判斷你是否需要釋放一個對象?
如果您聲明具有retain屬性的屬性,是否需要在將屬性設置爲nil之前釋放該屬性?
@synthesize指令是做什麼的?
你能描述返回已分配給調用者(且來電者應該釋放)的對象,並返回一個自動釋放對象的方法等的命名約定區別?你如何判斷你是否需要釋放一個對象?
如果您聲明具有retain屬性的屬性,是否需要在將屬性設置爲nil之前釋放該屬性?
@synthesize指令是做什麼的?
Aaron在下面列出了內存分配的一個很好的來源。
關於@synthesize
:
假設你有一個屬性P
,你必須做的是寫一個getter和爲它的制定者。有一些常見的方法,其中之一是當您設置該屬性並釋放舊值時保留該對象。 E.G:
- (void)setP:(PClass *)value
{
[value retain];
[_pInstanceVariable release];
_pInstanceVariable = value;
}
由於這是一個代碼很常見的一塊,編譯器可以爲您自動執行它,如果你指定的屬性聲明retain
關鍵字,然後在你的實現做@synthesize
。編譯器將生成上面提到的代碼,這意味着您的代碼將更加清潔,而且不會有繁瑣的重複部分。
同樣適用於干將真實的,除非你想要的東西複雜得多:
- (PClass *)p
{
return _pInstanceVariable;
}
的@synthesize
將做的工作
內存分配信息和命名可以在這裏找到
合成這裏
蘋果網站記錄有出色的文檔,我建議首先尋找在那裏。
你只釋放或自動釋放對象你自己。 如果使用名稱以「黃金」或「新」,或包含「複製」(例如,分配,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],儘管我認爲這只是個人偏好。
你應該一般不會問一個三個問題。 「@綜合」問題與其他兩個無關。每個問題應該是一個問題,以便其他用戶可以搜索他們的問題,並找到他們的問題,而不必通過與其無關的其他問題。 – 2010-10-15 21:25:59