Objective-Cで、ネストされた辞書を使用して、NSMutableDictionaryインスタンス変数を適切にリリースする方法は?
-
05-07-2019 - |
質問
次のようなObjective-Cクラスがあります:
@interface myClass : NSObject
{
NSMutableDictionary *aDict;
}
そのセッターメソッドは次のようになります。
- (void) setADict: (NSMutableDictionary *) newDict
{
[aDict release];
[newDict retain];
aDict = newDict;
}
オブジェクトのインスタンスを作成し、データをaDictに入れて、オブジェクトを削除して、プロセスのメモリをクリーンアップしたい。 2つの質問:
1) myClass の dealloc メソッドで aDict をリリースする必要がありますか?
[aDict release];
=============================================== ==============================
2) keyA と keyB で表される aDict にいくつかの子辞書をネストしました。
// aDict:
{
keyA = {
keyA1 = "Hello world";
keyA2 = 1234;
};
keyB = {
keyB1 = Earth;
keyB2 = 25000;
};
}
[aDict release] メッセージ" propagate down the chain" their キー/値オブジェクトを含む、aDict内のすべての子辞書をクリーンアップしますか?または、それらを取り除くために何か他のことをする必要がありますか?
解決
はい。
コレクションオブジェクトは、収集しているものを保持するため、コレクションの割り当てが解除されると、保持とリリースのバランスが取られます。
その後、保持していたディクショナリのいずれかが割り当て解除されると、ディクショナリはコレクションであり、コレクションオブジェクトが収集しているものを保持するため、キー/値ペアも解放されます。
配列およびセットについても同様です。
ただし、コードにバグがあります。次のものがあります:
- (void) setADict: (NSMutableDictionary *) newDict
{
[aDict release];
[newDict retain];
aDict = newDict;
}
newDict
が aDict
と同じオブジェクトである場合を考慮してください。次に、辞書を解放し、割り当てを解除し、それを保持しようとしますが、失敗します!もうありません。
これを修正する方法は3つあります。ここにあります:
- (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;
}
3番目のものは最も単純で、2番目のものは時間の経過とともに最も速く、最初のものは meh です。最初のものは、自動解放プールを混乱させます(メモリの膨張につながる場合としない場合があります)。 2番目と3番目は、安全性とプロパティメモリ管理の点で同等です。ただし、同じ辞書を自分で設定している場合は、2番目のメソッドで不要なメソッド呼び出しが保存されます。
他のヒント
NSMutableDictionary
は、リリース時にすべてのオブジェクト(値)をリリースします。
NSMutableDictionary
はキーをコピーし、追加した各キー/値のペアの値に保持を送信します。 Cocoaの慣習では、何かが参照を保持している場合、参照を解放する責任があります。
エントリを追加するメソッド 辞書—の一部として 初期化(すべての辞書用) または変更中(変更可能 辞書)—各キー引数をコピー (キーはNSCopyingに準拠する必要があります プロトコル)にコピーを追加します 辞書。対応する各値 オブジェクトは保持メッセージを受信します 割り当てが解除されないようにする 辞書が終わる前に それ。