2016-05-30 6 views
0

mutableArrayに新しい要素を追加すると、以前に追加された要素(辞書からフェッチ)も新しく追加された要素で置き換えられます。 HEREnsmutableArray最後に追加されたオブジェクトで要素を置換する

for (int i = 0; i < [_ContentArray count]; i++){ 

    if ([[[_ContentArray objectAtIndex:i]objectForKey:@"type"] isEqualToString:@"video"]) { 

     NSString *videoUrl = [[_ContentArray objectAtIndex:i]objectForKey:@"url"]; 

     NSString *videoName = [[_ContentArray objectAtIndex:i]objectForKey:@"title"]; 


     [_videoContentDict setValue:videoUrl forKey:@"url"]; 
     [_videoContentDict setValue:videoName forKey:@"title"]; 

     [_videoArray addObject:_videoContentDict]; 


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

    } 

    } 

- _videoContentDictがmutableDictionary _videoArrayである私はあなたがNSMutableArrayにして新しいオブジェクトを持つたびに、古いオブジェクトを取得すると思いますmutableArray

+0

は、両方のためのメモリを割り当てられたことがありますか?別の配列に値を追加するために辞書を使う理由は何ですか? NSObjectを使用して値を格納できます。 –

+0

あなたは、yは1つの辞書を持っています。その辞書を 'videoArray'に繰り返し追加しています。辞書を変更すると、その変更はすべての要素が同じ辞書への参照であるため、配列内のすべての要素に反映されます。 – Paulw11

答えて

1

です。 forループの外側にNSMutableDictionaryが割り当てられているためです。

だからあなたNSMutableDictionaryのalloc initは、コードを次のようなforループ側で行います。

for (int i = 0; i < [_ContentArray count]; i++){ 

    if ([[[_ContentArray objectAtIndex:i]objectForKey:@"type"] isEqualToString:@"video"]) { 

     _videoContentDict = [[NSMutableDictionary alloc]init]; 
     NSString *videoUrl = [[_ContentArray objectAtIndex:i]objectForKey:@"url"]; 

     NSString *videoName = [[_ContentArray objectAtIndex:i]objectForKey:@"title"]; 


     [_videoContentDict setValue:videoUrl forKey:@"url"]; 
     [_videoContentDict setValue:videoName forKey:@"title"]; 

     [_videoArray addObject:_videoContentDict]; 


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

    } 

    } 
関連する問題