1

次のようなObjective-Cクラスがあります。

@interface myClass : NSObject
{
    NSMutableDictionary *aDict;
}

その setter メソッドは次のようになります。

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

オブジェクトのインスタンスを作成し、データを aDict に入れました。次に、オブジェクトを削除して、その過程でメモリをクリーンアップしたいと考えています。2 つの質問:

1)示されているように、myClassdeallocメソッドでaDictを解放する必要がありますか?

[aDict release];

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

2)次のように、いくつかの子辞書をaDictにネストしました。これは、 keyAおよびkeyBで表されます。

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

[ aDictリリース]メッセージは「チェーンを伝播」しキー/値オブジェクトを含む aDict 内のすべての子辞書をクリーンアップしますか? または、それらを取り除くために何か他のことをしなければなりませんか?

4

2 に答える 2

4

はい。

コレクション オブジェクトは、収集しているものを保持するため、コレクションの割り当てが解除されると、保持と解放のバランスが取れます。

次に、保持していた辞書の 1 つが割り当て解除された場合、キーと値のペアも解放されます。これは、辞書がコレクションであり、コレクション オブジェクトが収集しているものを保持しているためです。

同じことが配列とセットにも当てはまります。

ただし、コードにバグがあります。あなたが持っている:

- (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 番目が時間の経過とともに最速であり、1 番目がmehだと思います。1 つ目は、自動解放プールを乱雑にします (メモリの肥大化につながる場合とそうでない場合があります)。2 番目と 3 番目は、安全性とプロパティ メモリ管理の点で同等です。ただし、同じ辞書をそれ自体に設定している場合は、2 番目の方法で不要なメソッド呼び出しを節約できます。

于 2009-09-10T00:34:08.283 に答える
2

NSMutableDictionaryリリース時にすべてのオブジェクト (値) をリリースします。

NSMutableDictionaryキーをコピーし、追加したキーと値のペアごとに保持を値に送信します。Cocoa の慣行では、何かが参照を保持している場合、それを解放する責任があります。

NSMutableDictionary リファレンスを参照してください

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

于 2009-09-10T00:45:15.473 に答える