2009-09-16 35 views
0

在我@interface孤單一NSArray *Monate依次爲:Objective-C:是一個自動釋放的初始化,然後在構造函數中保留錯誤嗎?

@property (nonatomic, retain) NSArray* Monate; 

如果我這樣做:

filePath = [[NSBundle mainBundle] pathForResource:@"SomeFile" ofType:@"plist"]; 
self.Monate = [NSArray arrayWithContentsOfFile:filePath]; 
在構造

,它被設置爲自動釋放的對象(是正確的?)。 因此,我應該做一個[Monate retain]事後?

+0

另一個注意事項:不要大寫ivars的名稱。 Obj-C約定是大寫的名字用於類。 – NSResponder 2009-09-16 23:55:32

回答

4

此代碼是正確的;您不應該添加保留呼叫。

+[NSArray arrayWithContentsOfFile:]將返回一個autoreleased NSArray。將其傳遞給-[YourClass setMonate:]將保留該對象並分配給後援伊娃。構造函數返回後,新的NSArray將有一個保留計數爲2,並添加一次到當前的自動釋放池(導致淨保留計數爲1)。

只要您在dealloc中釋放數組,代碼是正確的。

2

你不應該做一個保留後。通過設置保留的@property,當您使用self.Monate二傳手

1)任何在單胞菌實例變量,如果有的話,會得到釋放一些特殊的事情發生。
2)新任務將獲得保留。

如果你使用分配的@property,那麼你就必須保留,但你的罰款你的方式。

作爲附帶說明,在目標c,大寫單詞通常保留給類名。我sugges了變化爲「單胞菌」,而不是「單胞菌」,因爲這可能導致混亂的道路

0

[NSArray arrayWithContentsOfFile:];返回一個自動釋放的數組,如果你想讓它掛起的時間比方法的末尾要長,那麼這個數組需要保留。

請注意您的財產聲明如何指定'retain'。這意味着任何self.property = x;叫你做將保留您在傳遞對象。

所以,你在做什麼,有正確的。只記得做self.property =零;在你的dealloc方法中。

將屬性設置爲零將釋放舊對象並將指針設置爲零,這是正確的方式。

相關問題