Objective-Cで、ネストされた辞書を使用して、NSMutableDictionaryインスタンス変数を適切にリリースする方法は?

StackOverflow https://stackoverflow.com/questions/1402778

質問

次のような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の慣習では、何かが参照を保持している場合、参照を解放する責任があります。

NSMutableDictionaryリファレンスを参照

  

エントリを追加するメソッド   辞書—の一部として   初期化(すべての辞書用)   または変更中(変更可能   辞書)—各キー引数をコピー   (キーはNSCopyingに準拠する必要があります   プロトコル)にコピーを追加します   辞書。対応する各値   オブジェクトは保持メッセージを受信します   割り当てが解除されないようにする   辞書が終わる前に   それ。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top