2012-03-26 17 views
0

これはおそらくかなり単純なYES | NOタイプの質問です。NSDictionary + ARC +コピーと参照の比較

私は他のNSDictionariesを含むNSDictionariesをいくつか持っています。 NSDictionary_ANSDictionary_Bとしましょう。これらはアプリの存続期間中存続します。

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

後には変更されます:NSDictionary_Aに含まれる

NSDictionariesは、さまざまなオブジェクトへの参照によって渡され

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

だから、最初の質問:@property器具は合成されとして保持される言い換えれば、nil'への参照を設定する -のでinstrumentのsetterは、新しい値を設定する前に、nilinstrumentの現在の値を設定し、そうであれば、これはNSDictionary_Aで参照のソースには影響しないのですか?私は答えがNOここにあると思います。また、おそらくNSDictionary_A1内の参照は、アプリの生活のために持続するので、@property機器がweakstrongとして格納されていることは重要ではありませんが、それはポインタであることから、weakする必要があります - YES

2番目の質問:NSDictionary_BアンNSDictionaryのは、オブジェクトに渡されますが、それはそのNSDictionaryの内の値の一部を変更することができます

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

NSDictionaryのcopyは値が変更されるか、またはthangを渡すこの全体の参照を完全に誤解しているので、ここで作成する必要がありますか?

答えて

1

ポインタがどのように動作するかが混乱しています。

最初の質問では、 "track.instrument"は単なるポインタです。だから、それは "ゼロを指している"ように始まります。

この:あなたは、それは問題doesntの全体のアプリのために持続しますあなたの辞書を確保することができる場合

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

手段、何がである、

「そのオブジェクトにゼロとポイントを指し停止」 @青鍵は決して​​譲渡されません。しかし、正しいコードを持つためには、弱いはずです。

編集:第2の質問を誤って読んでいた。

2番目の質問:これについて

:辞書からNSDictionaryの

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

最初にポインタを指します。

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

NSDictionaryなので、これは無効です。 NSDictionariesは変更不可能なので変更できません.SSDはNSMutableDictionaryでなければなりません。

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

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

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

VERY IMPORTANT:あなたが "新しい" 辞書を作成しているので。 track.playbackTypeは強くなければなりません。または、関数が終了した後にただちに取り消され、mutableDictが有効範囲外になります。

+0

ありがとうございました!私は不変部分を考慮していませんでした。 –

0

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

第2の質問については、それはかなり混乱しており、playbackTypeについての詳細が必要です。あなたはそれがNSDictionaryだと言うが、NSDictionaryはプロパティmaxRangeを持たないので、あなたが定義したタイプでなければならない。 NSDictionaryの値は不変なので変更できません。

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

関連する問題