簡體   English   中英

Objective-C:在構造函數中,自動釋放的初始化后跟一個保持錯誤嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM