12

元の辞書から新しい辞書を派生させるためのより良い方法と考えられているものは次のとおりです。

[NSDictionary dictionaryWithDictionary:otherDictionary];

また

[otherDictionary copy];

?

時々、不変の辞書から可変の辞書を作成する必要があるため、この質問が寄せられ続けています。おそらく何もないかもしれませんが、いくつかのユースケースで一方が他方よりも優れているかどうかを知りたいです。

編集:上記の方法を使用して可変辞書を導出できないことは知っています。一般的な方法で質問をしたかっただけで、この質問に日々どのように直面しているかを説明したいと思います. 私はそれについてもっと明確にするべきでした。

4

4 に答える 4

7

この質問にはいくつかのことがあります。

まず、これら 2 つはわずかに異なります。

[NSDictionary dictionaryWithDictionary:otherDictionary];    #1
[otherDictionary copy];                                     #2

#1 は、自動解放されたオブジェクト (つまり、+0 の保持カウントを持つオブジェクト) を返します。#2 は保持カウントが +1 のオブジェクトを返すため、呼び出し元はreleaseある時点で呼び出す責任があります。

otherDictionary(次の場合もわずかに異なりますnil。#1 は空の辞書を返しますが、#2 は を返しますnil。)

もちろん、あなたの質問では、実際に変更可能なコピーについて質問しています。次のいずれかを実行できることに注意してください。

[NSMutableDictionary dictionaryWithDictionary:otherDictionary];
[otherDictionary mutableCopy];

上記と同じ注意事項が、これらの各方法に適用されます。

おそらくそれ自体が最善のmutableCopy方法というわけではありませんが、最も明確な方法です (ある時点で保持されたオブジェクトを解放する必要があることを覚えておいてください)。

于 2013-06-12T23:30:01.537 に答える
3

それらは意味的に同等です。どちらを使用するかは、完全に選択の問題です。-copyより短く、何が起こっているのかをより明確にするという理由だけで、私は を支持します。

変更可能なコピーが必要な場合 (テキストが示すように)、投稿した行は機能しません。必要なもの:

[NSMutableDictionary dictionaryWithDictionary:otherDictionary];

または、同等に:

[otherDictionary mutableCopy];

メモリ管理に関しては、-copy-mutableCopyは +1 の保持カウントを持つオブジェクトを返します。つまり、使い終わったら解放する必要があります。-dictionaryWithDictionary:自動解放されたオブジェクトを返すため、使い終わったら解放する必要はなく、保持したい場合は保持する必要があります。古い (ARC 以前の) 時代には、この区別は、使用するアプローチがメモリ管理のニーズに依存する可能性があることを意味していました (もちろん、追加の保持または解放の後でも、それらは依然として交換可能です)。もちろん、ARC を使用している場合、この区別は問題になりません。

于 2013-06-12T23:23:44.047 に答える
0

Cocoa が承認した方法は、変更可能なコピーを返す mutableCopy メソッドを送信することです。

NSMutableDictionary *mutableOtherDictionaryCopy = [otherDictionary mutableCopy]
于 2013-06-12T23:23:31.090 に答える