2016-08-13 2 views
0

最近、私はkey-> value(NSArray)のような形で辞書を削除するポストを作成しました。コピーされた辞書をクリアする

私は2つのNSDictionaryを持っていますが、最初はデータで、2番目のキーには最初のすべてのキーが含まれている必要がありますが、そのキーの空のデータです。データは後で追加/削除されます。これは私がメインのデータ辞書(self.viewModel.releaseDict)からコピーを作成する方法である:

_releaseFormsDictCopy = [NSMutableDictionary dictionaryWithDictionary:self.viewModel.releaseDict]; 

私はオブジェクト(2 NSDictionaries)が異なるメモリを持っていることを、確認された場合。

しかし、この方法で私は「クリア」のコピーがする場合:

-(void)clearAllArraysInsideKeys{ 

    for(id key in self) { 
     NSMutableArray *arr = [self objectForKey:key]; 
     [arr removeAllObjects]; 
    } 
} 

それは両方の辞書だけでなく、コピーからすべてのデータをフラッシュすることが表示されます。どのように最初のNSDictionaryをクリアするのを防ぐには?

答えて

1

辞書は異なるインスタンスでも構いませんが、その内容は同じですが、浅い(変更可能な)コピーが作成されています。あなたの説明から、ディクショナリは異なるインスタンスであり、値が異なるインスタンスであるため、ディクショナリがそれぞれ異なるインスタンスであり、それぞれが含む配列のディープコピーです。

単純なオプションは、そのレベルのみをディープコピーすることです。空のNSMutableDictionaryを作成し、self.viewModel.releaseDictを列挙し、各キーに値のmutableCopyを追加します。

これは辞書に含まれる各配列の「浅い」コピーを含むディープ・アイソンのコピーです。

+0

私はそれがうまくいくと思います、ありがとう。私は単純な解決策を試みた - NSArray * arr = @ []; _releaseFormsDictCopy = [NSMutableDictionary dictionaryWithObjects:arr forKeys:_sectionsArray];ただし、例外がスローされます。私はここで何をやったの? –

+0

あなたは不変の配列を作成しましたので、後でいつかそれを可変長として使用しようと思いますか? – Wain

+0

いいえ、その行に例外がスローされます.NSArray * arr = @ []; _releaseFormsDictCopy = [NSMutableDictionary dictionaryWithObjects:arr forKeys:_sectionsArray]; –

関連する問題