2011-12-07 4 views
0

Obj-Cの新機能です。ここに少し問題があります。obj-cのコレクションリファレンス

私は配列

NSMutableDictionary *myDict = [[NSMutableDictionary alloc] init]; 
NSMutableArray *myArray = [[NSMutableArray alloc] init]; 

[myDict setObject:[NSNumber numberWithInt:100] forKey:@"Record"]; 
[myDict setObject:@"www" forKey:@"Name"]; 
[myArray addObject:myDict]; 

[myDict setObject:[NSNumber numberWithInt:80] forKey:@"Record"]; 
[myDict setObject:@"eee" forKey:@"Name"]; 
[myArray addObject:myDict]; 

[myDict setObject:[NSNumber numberWithInt:70] forKey:@"Record"]; 
[myDict setObject:@"rrr" forKey:@"Name"]; 
[myArray addObject:myDict]; 

[myDict setObject:[NSNumber numberWithInt:0] forKey:@"Record"]; 
[myDict setObject:@"ttt" forKey:@"Name"]; 
[myArray addObject:myDict]; 

NSLog(@"myArray %@",myArray); 

にかかわらず、ここで悪い実装コードの(と私の悪い英語だけでなく:P)に一時辞書から値を挿入しようとしている私は数字にしようとしているものを、アウトはmyArrayにそれぞれ入れたらmyDictをきれいにする方法です。

addObjectの後に[myDict removeAllObjects];を使用すると、最後に空の配列が返されます。

ありがとうございます!

回答ありがとうございました。[myArray addObject:[[myDict copy] autorelease]];でコードは正常に動作します。

答えて

4

ここでの問題は、全く同じ変更可能な辞書を配列に何度も追加していることです。つまり、あなたの配列はまったく同じオブジェクトへの参照のコレクションです。したがって、配列内のすべてのオブジェクトが最後のオブジェクトと同一であることは驚くべきことではありません。

あなたが望むようにするには、2つの選択肢があります。最初は、変更可能な辞書を毎回コピーし、そのコピーを配列に追加します。

[myArray addObject:[[myDict copy] autorelease]]; 

他の解決策は、別の辞書を使用して開始することです。代わりに、可変辞書たびに変異させる、あなたはブランドの新しいNSDictionaryの構築ができます*として

[myArray addObject:[NSDictionary dictionaryWithObjectsAndKeys: 
        [NSNumber numberWithInt:100], @"Record", 
        @"www", @"Name", 
        nil]]; 

[myArray addObject:[NSDictionary dictionaryWithObjectsAndKeys: 
        [NSNumber numberWithInt:80], @"Record", 
        @"eee", @"Name", 
        nil]]; 
+0

おかげで、どのような答えはここにパフォーマンスの面でより良いアプローチでしょうか?または低レベルのコード(私は画面上に何かを描画しないことなど)のパフォーマンスは心配するべきではありません。 – Ivan

+0

@Ivan:辞書を1回の呼び出しで構築できる場合は、それを行う必要があります。 –

2

私は、あなたが通常通り[myDict removeAllObjects]を使用することができます

[myArray addObject:[[myDict copy] autorelease]]; 

...あなたは、アレイに追加する前に辞書をコピーする必要があると思います。

0

NSMutableDictionary *の辞書のオブジェクトへのポインタであることを示唆しています。 それを配列に追加すると、配列内の要素だけでなく、myDictによって指し示されているオブジェクトも同じです。 したがって、私は、それぞれが追加した後は、新しい辞書を作成勧め:

NSMutableDictionary *myDict = [[NSMutableDictionary alloc] init]; 
NSMutableArray *myArray = [[NSMutableArray alloc] init]; 

[myDict setObject:[NSNumber numberWithInt:100] forKey:@"Record"]; 
[myDict setObject:@"www" forKey:@"Name"]; 
[myArray addObject:myDict]; 

myDict = [[NSMutableDictionary alloc] init]; 

[myDict setObject:[NSNumber numberWithInt:80] forKey:@"Record"]; 
[myDict setObject:@"eee" forKey:@"Name"]; 
[myArray addObject:myDict]; 

私はあなたが上記のコードでARCを使用していると仮定します。

以上のObjective-C'ish方法がするだろう、けれども:答えを

[myArray addObject: [NSDictionary dictionaryForObjectsAndKeys: [NSNumber numberWithInt:80], @"Record", @"www", @"Name"]]; 
+0

私は間違っていますか?コメントなし-1? – Krizz

関連する問題