[英]Memory Management in Objective-C, initializing a new array to an autoreleased array from another function
我試圖更好地了解內存管理。 如果我有一個返回像這樣的自動釋放NSArray的函數
// DataClass
- (NSArray *)getData {
NSMutableArray *array = [[[NSMutableArray alloc] init] autorelease];
// do some stuff to get data from sqlite
return array;
}
然后在另一個類文件中,我想使用此getData。 我有財產
@property (nonatomic, retain) NSArray *myData;
- viewDidLoad {
NSMutableArray *data = [[NSMutableArray alloc] init];
data = [DataClass getData];
self.myData = data;
[data release];
}
為什么在這種情況下會出現嚴重的訪問錯誤? 我知道這是因為[數據發布],但是我認為由於getData方法返回了自動釋放的NSArray,並且因為我使用alloc / init初始化了一個新的NSMutableArray,那么我需要釋放它嗎? 還是發生了什么事情,即使我使用alloc / init初始化數據,但我什至沒有使用它,因為在data = [DataClass getData]語句中,我指向另一個NSArray,然后嘗試從中釋放已經自動釋放的NSArray。 getData,然后NSMutableArray數據仍在內存中的某個位置浮動? 提前致謝。
你的猜測是正確的。 :-)
首先,正如所寫的,在viewDidLoad
您泄漏的data
,當你分配給你的Alloc 1號線/初始化data
調用的結果getData
第2行。
然后,您是對的,此時的data
指向一個自動釋放的對象。 因此,調用release
是一件壞事。
坦白說,在您的viewDidLoad
方法中,您實際上根本不需要調用getData
。 此類操作的完整且適當的順序是:
NSMutableArray *array = [[NSMutableArray alloc] init];
// here is where you could fill array with your data, or call a method to
// which you pass array to be filled.
self.data = array;
[array release];
假設data屬性是使用retain
定義的。 通過使用self.
前綴,即可為您完成retain
。
這有幫助嗎?
您的代碼有兩個可能的問題。 第一個是肯定的:
NSMutableArray *data = [[NSMutableArray alloc] init];
data = [DataClass getData];
這不是初始化對象的正確模式。 假設存在一個名為getData
的類方法,該方法可以執行您想要的操作(情況可能並非如此,稍后再介紹)。 第一行將為新數組分配內存,並返回指向它的指針。 然后,第二行將立即重新分配該指針,使其指向另一個(自動釋放)數組,從而泄漏該過程中的第一個數組。
其次,您的getData
方法具有以下簽名:
- (NSArray *)getData;
暗示它是一個實例方法,意味着您將其發送到DataClass
的實例。 但是,調用該方法的代碼通過將消息發送給類本身而不是其實例來實現。 這可能只是您發帖中的錯字,但比后悔更安全。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.