簡體   English   中英

iPhone-有關保留數組的問題

[英]iphone - a question about retaining an array

我對Objective-C有點陌生,我試圖了解有關此保留釋放機制的一些知識。

假設我需要一個數組來維持應用程序的整個生命周期。 因此,假設我使用類似的方法創建數組

myArray = [[NSMutableArray alloc] init];

在應用程序的開頭。

在應用程序期間,此數組可能會刪除所有對象,並從其他數組中添加對象,等等。另外,假設在添加對象的這些操作之一中,我向數組添加了自動釋放的對象。 兩個問題:

  1. 分配數組時,添加到該數組的對象將始終處於活動狀態並且永不釋放嗎?

  2. 我知道將對象添加到數組將增加其保留計數。 這對自動釋放的對象也有效嗎? (也許自動釋放的數組來自其他方法)

謝謝

第一個問題的答案是肯定的 -根據定義,任何集合對象都將保持其收集的對象處於活動狀態,直到集合本身被釋放為止。

對於第二個問題,好吧,發送autorelease消息的對象將擁有權轉移到當前的自動釋放池中,直到該對象被另一個作用域擁有為止,此時該對象將從池中刪除。

例如:

[[[NSArray alloc] init] autorelease];

不是內存泄漏(和你沒有自己的對象)假設有一個可用的自動釋放池。

基本是在保留計數達到0時釋放對象。

因此,現在回答您的問題:數組中的對象擁有所有者。 因此,在釋放數組之前,將保留數組集合中的對象。

關於自動釋放對象---自動釋放僅討論當前所有權,因此,當您將自動釋放對象添加到數組集合時,數組將保留計數增加1並擁有所有權。 自動釋放會在其周期中將保留計數減少1。 (仍然還有1個保留計數來釋放對象)

注意:自動釋放-將對象添加到自動釋放池將使保留計數在其消耗周期中減少---僅當保留計數為0(沒有所有者)時,對象才會被釋放。

我更喜歡在結束時釋放它,而不是自動釋放。.控制何時釋放它似乎是一個更好的選擇。.當dealloc只是:[myArray removeAllObjects],然后是[myArray release]時,函數結束。

如您所知,目標c對象是引用計數。 當且僅當其引用計數達到零且沒有例外時,任何目標c對象才會被釋放。

將對象添加到NSMutableArray時,數組將保留該對象。 這意味着,只要您沒有在其他地方保留/釋放對象,添加到數組的對象就會一直存在,直到(1)從數組中刪除該對象,以及(2)數組本身被釋放后,在該位置將釋放存儲在其中的每個對象。

將“自動釋放”發送到對象會將其添加到封閉的自動釋放池中。 這意味着當自動釋放池被耗盡/釋放時,將向對象發送釋放消息。 對象是否將被釋放取決於其他一些代碼是否保留了它。

分配數組時,添加到該數組的對象將始終處於活動狀態並且永不釋放嗎?

在正常情況下,即在您不過度釋放它們的情況下,它們會。 例如,

// take ownership (alloc) followed by relinquish ownership (autorelease)
// the net result is that this code snippet DOES NOT own someObject
SomeClass *someObject = [[[SomeClass alloc] init] autorelease];

// myArray takes ownership of someObject
[myArray addObject:someObject];

// someObject is INCORRECTLY (over)released
[someObject release];

考慮到沒有其他代碼聲明對someObject所有權,因此不會被“釋放”,因為它已被過分釋放。

我知道將對象添加到數組將增加其保留計數。 這對自動釋放的對象也有效嗎? (也許自動釋放的數組來自其他方法)

是。 集合在添加對象時不會查看保留計數或自動釋放狀態,也不會。 數組只是將-retain發送到要添加的對象,因此獲得該對象的所有權,而與擁有(或不擁有)該對象的其他代碼無關。

內存管理和對象所有權的全部要點是相對考慮所有權:如果集合需要一個對象,它將獲取該對象的所有權; 如果發布了集合或從集合中刪除了對象,它將放棄對象的所有權。 該集合並不關心該對象是否由其他對象或代碼擁有,而是僅關注其擁有該對象的角度。 同樣的原則也適用於您的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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