1

我有一個Objective-C類,看起來像:如何在Objective-C中正確釋放NSMutableDictionary實例變量和嵌套字典?

@interface myClass : NSObject 
{ 
    NSMutableDictionary *aDict; 
} 

它的setter方法是這樣的:

- (void) setADict: (NSMutableDictionary *) newDict 
{ 
    [aDict release]; 
    [newDict retain]; 
    aDict = newDict; 
} 

我所創建的對象的實例,將數據放入aDict,和現在想擺脫這個對象,在這個過程中清理它的記憶。兩個問題:

1)我應該釋放aDictmyClass的的dealloc方法,如圖?

[aDict release]; 

=========================================== ==================================

2)我已經嵌套幾個兒童字典到aDict,通過KEYAKEYB表示,如下所示:

// aDict: 
{ 
    keyA =  { 
     keyA1 = "Hello world"; 
     keyA2 = 1234; 
    }; 
    keyB =  { 
     keyB1 = Earth; 
     keyB2 = 25000; 
    }; 
} 

將一個[aDict釋放]消息「傳播陶氏鏈「並清理aDict中的所有子字典,包括鍵/值對象?或者,我需要做其他的事情來擺脫它們嗎?

回答

4

是的。

集合對象保留他們正在收集的東西,所以當集合被釋放時,它會將保留與發佈平衡。

然後,如果其中一個保存的字典被釋放,它也將釋放它的鍵/值對,因爲字典是一個集合,集合對象保留他們正在收集的東西。

數組和集合也是如此。

但是,您的代碼中存在一個錯誤。您有:

- (void) setADict: (NSMutableDictionary *) newDict 
{ 
    [aDict release]; 
    [newDict retain]; 
    aDict = newDict; 
}

考慮當newDict是相同的對象aDict。然後你釋放字典,它被釋放,然後你試圖保留它,但哎呀!它不再存在。

有三種方法可以解決這個問題。在這裏,他們是:

- (void) setADict: (NSMutableDictionary *) newDict 
    { 
     [aDict autorelease]; 
     [newDict retain]; 
     aDict = newDict; 
    } 

    - (void) setADict: (NSMutableDictionary *) newDict 
    { 
     if (aDict != newDict) { 
     [aDict release]; 
     [newDict retain]; 
     aDict = newDict; 
     } 
    } 

    - (void) setADict: (NSMutableDictionary *) newDict 
    { 
     [newDict retain]; 
     [aDict release]; 
     aDict = newDict; 
    }

我想說的第三個最簡單,第二個是最快的一段時間,而首先是MEH。第一個會混淆你的autorelease池(這可能導致內存膨脹或不會導致內存膨脹)。在安全和財產記憶管理方面,第二和第三是同等的。然而,如果你碰巧在自己的字典上設置了相同的字典,第二個將省去不必要的方法調用。

+0

哇,謝謝你的回答,並且非常感謝你抓住錯誤! :)我正在研究Hillegass的「Mac OX X可可編程」,他有三種完全相同的mem管理習慣。愚蠢的我扭轉了保留/釋放的順序,哈哈。我現在不會忘記它,保證! – 2009-09-10 01:42:41

2

NSMutableDictionary將在發佈時釋放所有對象(值)。

NSMutableDictionary複製密鑰並將保留值發送給您添加的每個鍵/值對。可可的做法是,當某些東西保留參考時,它負責釋放它。

See NSMutableDictionary reference

中的方法條目添加到 詞典-是否爲 初始化(對於所有字典) 或修飾(可變 字典)中的一部分-copy每個鍵參數 (密鑰必須符合到NSCopying 協議),並將副本添加到 字典中。每個對應的值對象接收到一個保留消息到 確保它不會被釋放, 在字典通過之前是 它。