簡體   English   中英

Objective-C中的內存管理,從另一個功能將新陣列初始化為自動發布的陣列

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

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