/ / NSDictionary + ARC +コピーvsリファレンス-Objective-c、ios

NSDictionary + ARC +コピーと参照の比較 - 目的c

これらはおそらく非常に単純なYES | NOタイプの質問です。

他のNSDictionariesを含むNSDictionariesがいくつかあります。まあ言ってみれば NSDictionary_A そして NSDictionary_B。これらはアプリの存続期間中持続します。

に含まれるNSDictionaries NSDictionary_A さまざまなオブジェクトへの参照によって渡されます。

track.instrument = [NSDictionary_A objectForKey:@"Blue"];

後で変更されます:

track.instrument = [NSDictionary_A objectForKey:@"Red"];

だから最初の質問:@property 楽器は合成され、次のように保持されます strong セッターもそうです instrumentの現在の値を設定します instrumentnil 新しい値を設定する前に、もしそうなら、これはの参照のソースに影響しますか NSDictionary_A -言い換えると、参照をに設定します nil"?書き出すだけで間違っているように聞こえます。だから答えは NO ここに。また、それはおそらく問題ではありません @property 機器は次のように保存されます weak または strong の参照以来 NSDictionary_A1 アプリの存続期間中持続しますが、これはポインターであるため、 weak - はい

2番目の質問: のNSDictionary NSDictionary_B オブジェクトに渡されますが、そのNSDictionaryの値の一部が変更される可能性があります。

track.playbackType = [NSDictionary_B objectForKey:@"Random"]; [track.playbackType objectForKey:@"maxRange"] = 20;

だから私は作る必要があります copy 値が変更されるため、ここでNSDictionaryを使用しますか、それともこの参照全体を完全に誤解していますか?

回答:

回答№1は1

あなたはポインタがどのように機能するかについて混乱しています。

最初の質問では、「track.instrument」は単なるポインタです。したがって、「nilを指す」として開始されます。

この:

track.instrument = [NSDictionary_A objectForKey:@"Blue"];

つまり、「nilを指すのをやめて、そのオブジェクトを指す」という意味です。

辞書が存続することを確認できる場合アプリ全体では、それは問題ではありません。@ blueキーにあるものは、割り当てが解除されることはありません。しかし、正しいコードを持つためには、それは弱いはずです。

編集:2番目の質問を間違って読んでいました。

2番目の質問:

これについて:

track.playbackType = [NSDictionary_B objectForKey:@"Random"];

最初にあなたのポインタは NSDictionary 辞書から。

[track.playbackType objectForKey:@"maxRange"] = 20;

NSDictionaryであるため、これは無効です。 NSDictionariesは不変であるため、変更できません。NSMutableDictionaryである必要があります。

ただし、変更したバージョンを元の辞書に戻すことに興味がない場合は、最初にNSMutableDictionaryとしてコピーしてから、変更することができます。

NSMutableDictionary *mutableDict = [[NSDictionary_B objectForKey:@"Random"] mutableCopy];

track.playbackType = mutableDict; //Note how track.playbackType has to be NSMutableDictionary aswell.

非常に重要: 「新しい」辞書を作成しているので。 track.playbackType 強力である必要があります。そうしないと、関数が終了した後、すぐに割り当てが解除され、 mutableDict スコープ外になります。


回答№2の場合は0

参照は単なるポインタであり、1をnilに設定します次の場合を除いて、効果はありません。これが最後の強参照であり、他の弱参照がまだ存在しています。その場合、すべての弱参照はnilになります。強力なプロパティは古い値をnilに設定し、事実上リリースコールを送信しますが、これは参照の内容ではなく、参照に影響します。

2番目の質問に関しては、それはかなり混乱していて、私はについてのより多くの情報が必要です playbackType。あなたはそれがNSDictionaryであると言いますが、NSDictionaryにはプロパティがありません maxRange したがって、定義したタイプである必要があります。 NSDictionaryは不変であるため、値を変更することもできません。

しかし、ここに一般的な答えがあります:可変オブジェクトへのポインタを強い(または弱い)として渡すと、元のオブジェクトのコンテンツを変更できます。可変オブジェクトへのポインタをコピーとして渡すと、元のオブジェクトに影響を与えない新しいオブジェクトが得られます。