4

多分それは非常に一般的でオタクな種類の質問です。NSMutableDictionaryがあり、それにいくつかのオブジェクトを追加してから、辞書をNSMutableArrayに追加しています。辞書を配列に追加した後、辞書のすべてのオブジェクトを削除し、それをnilに設定します。これにより、辞書を追加した配列からデータが削除されます。アレイがデータを失う原因となっている何か問題がありますか?

NSMutableDictionary *lDict = [[NSMutableDictionary alloc]init];
[lDict setObject:lDate forKey:@"date"];
[lDict setObject:presentationId forKey:@"pptId"];
[lDict setObject:presentationName forKey:@"PresentationName"];
[lDict setObject:presentationDesc forKey:@"PresentationDesc"];
[lDict setObject:presentationThumb forKey:@"presentationThumb"];
[lDict setObject:postCallRowId forKey:@"postCallId"];
[lDict setObject:userReaction forKey:@"userReaction"];
[lDict setObject:appDel.gRegion forKey:@"Region"];
[lDict setObject:@"Presentation" forKey:@"ContentType"];

[durationArray addObject:lDict];

 //here I am having data in array

[lDict removeAllObjects];
lDict=nil;

//here I lost data in array also
4

3 に答える 3

8

このようなものはどうですか:

NSMutableDictionary *lDict = [[NSMutableDictionary alloc]init];

[lDict setObject:lDate forKey:@"date"];
[lDict setObject:presentationId forKey:@"pptId"];
[lDict setObject:presentationName forKey:@"PresentationName"];
[lDict setObject:presentationDesc forKey:@"PresentationDesc"];
[lDict setObject:presentationThumb forKey:@"presentationThumb"];
[lDict setObject:postCallRowId forKey:@"postCallId"];
[lDict setObject:userReaction forKey:@"userReaction"];
[lDict setObject:appDel.gRegion forKey:@"Region"];
[lDict setObject:@"Presentation" forKey:@"ContentType"];

//make a new dictionary and save it
[durationArray addObject:[[NSDictionary alloc] initWithDictionary:lDict]];

[lDict removeAllObjects];
lDict=nil;

可変ディクショナリからすべてのオブジェクトを削除する前に、同じ内容の新しいディクショナリを作成し、これを配列に保存します。

新しいディクショナリを作成することにより、値を保存するだけでなく、元のディクショナリでキーと値のペアの設定を維持できます。

于 2013-03-27T14:29:17.110 に答える
2

トップダウンで、配列はディクショナリへのポインタを保持し、ディクショナリは追加したすべてのオブジェクトへのポインタを保持します。ディクショナリを配列に追加しても、配列に個々のオブジェクトへのポインタがあるという意味ではありません。配列はディクショナリについてのみ認識し、ディクショナリのみがオブジェクトを認識します。ディクショナリからすべてのオブジェクトを削除すると、配列は何も変更されていないことを認識しません。それに関する限り、それはまだ辞書へのポインタを持っています。

ディクショナリから配列にオブジェクトを追加しようとしている場合は、ディクショナリを繰り返し処理して、個々のオブジェクトを1つずつ配列に追加する必要があります。

 for (NSString *key in lDict)
 {
      [durationArray addObject:[lDict objectForKey:key]];
 }

 [lDict removeAllObjects];
 lDict=nil;

この時点でも、配列にはオブジェクトが残っているはずです。

一度にすべてを追加したい場合は、次のことを試すことができます。

 [durationArray addObjectsFromArray:[lDict allValues]];
 [lDict removeAllObjects];
 lDict = nil;
于 2013-03-27T14:19:08.927 に答える
0

掃除する特別な理由はありNSMutableDictionaryますか?他の人が述べたようNSArrayに、はオブジェクトへのポインタを保持しているので、これらも「クリーン」になります。

これを防ぐ1つの方法は、のコピーをusingに追加することですNSDictionaryNSArrayまたは、変更可能なものにする必要がある場合は[durationArray addObject:[lDict copy]];呼び出します[lDict mutableCopy])。ループに辞書を追加する場合は、NSDictionaryこのループの外側ではなく、内側に作成するだけです。

于 2013-03-27T14:24:51.907 に答える