[英]Objective-C: Is an autoreleased initialisation followed by a retain wrong in a constructor?
在我的@interface
有一個NSArray *Monate
其后是:
@property (nonatomic, retain) NSArray* Monate;
如果我做:
filePath = [[NSBundle mainBundle] pathForResource:@"SomeFile" ofType:@"plist"];
self.Monate = [NSArray arrayWithContentsOfFile:filePath];
在構造函數中,將其設置為自動釋放的對象(對嗎?)。 那之后我應該做[Monate retain]
嗎?
該代碼是正確的; 您不應該添加保留呼叫。
+[NSArray arrayWithContentsOfFile:]
將返回自動釋放的NSArray
。 將其傳遞給-[YourClass setMonate:]
將保留該對象並分配給后備ivar。 構造函數返回后,新的NSArray
的保留計數為2,並一次添加到當前自動釋放池中(凈保留計數為1)
只要您在dealloc中釋放該數組,此代碼就是正確的。
之后您不應該保留。 通過設置保留的@property,當您使用self.Monate setter時會發生一些特殊的事情
1)Monate實例變量中的任何內容(如果有)將得到釋放。
2)新的任務將被保留。
如果您要使用@property的assign,那么您將必須保留,但您的狀況會很好。
附帶說明,在目標c中,大寫單詞通常保留用於類名稱。 我建議將其更改為“ monate”而不是“ Monate”,因為這可能會導致混亂
[NSArray arrayWithContentsOfFile:]; 返回一個自動釋放的數組,如果您希望它比方法結尾更長的時間,則需要保留該數組。
注意您的屬性聲明如何指定“保留”。 這意味着任何self.property = x; 您執行的呼叫將保留您傳遞的對象。
因此,您在那做的是正確的。 只記得做self.property = nil; 在您的dealloc方法中。
將屬性設置為nil將釋放舊對象,並將指針設置為nil,這是正確的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.