2012-02-09 2 views
0

То, что я пытаюсь сделать, это поиск массива словарей для определенного целевого словаря, а если найден, замените фактический словарь в исходном массиве на целевой словарь. Алгоритм поиска работает, но копирование словарей не выполняется. Основная линия в вопросе является тот, который говорит:Копирование NSMutableDictionary через указатели

tempDict=targetDict;

Я надеялся, что tempDict будет указатель на исходный словарь из исходного массива, но при попытке войти имя автора, я получаю " moe "вместо" steve ".

-(void)viewDidAppear 
{ 
    [actualDictionary setObject:@"test" forKey:@"mainNote"]; 
    [actualDictionary setObject:@"moe" forKey:@"authorName"]; 

    [targetDictionary setObject:@"test" forKey:@"mainNote"]; 
    [targetDictionary setObject:@"steve" forKey:@"authorName"]; 

    [arrayOfNotes addObject:actualDictionary]; 
    [self beginSearchWithMainArray]; 
} 

-(void)beginSearchWithMainArray; 
{ 
    [self searchArray:arrayOfNotes forDict:targetDictionary]; 
} 
-(void)searchArray:(NSMutableArray*)array forDict:(NSMutableDictionary*)targetDict 
{ 
    NSString *targetText=[targetDict objectForKey:@"mainNote"]; 
    for(int i=0;i<[array count];i++) 
    { 
     NSMutableDictionary *tempDict=[array objectAtIndex:i]; 
     NSString *possibleText=[tempDict objectForKey:@"mainNote"]; 
     if([possibleText isEqualToString:targetText]) 
     { 
      //found match, replace tempDict with targetDict 
      tempDict=targetDict; 
      NSLog(@"found match"); 
      NSString *authorName=[[arrayOfNotes objectAtIndex:0] objectForKey:@"authorName"]; 
      NSLog(@"%@", authorName); //should be steve 
      return; 
     } 
     //no match, search sub notes 
     ... 
    } 
} 

ответ

3

заменить

tempDict=targetDict; 

с

[array replaceObjectAtIndex:i withObject:targetDict]; 

или

[tempDict setDictionary:targetDict] 

tempDict является указателем на NSMutableDictionary, но назначить его на другой экземпляр не означает изменения содержание t он предыдущий экземпляр

вы должны изменить то, что «точку указателя на» не «указатель», то почему вы можете использовать setDictionary: сделать «назначение»

+0

Ах да, я думаю, что это решала issue..thanks! – Snowman

0

tempDict просто ссылка на совпавший элемент из массив. Изменение его значения не изменит массив. Заменить

tempDict=targetDict; 

в

[array replaceObjectAtIndex:i withObject:targetDict]; 
Смежные вопросы