2012-01-25 3 views
2
for (int cnt = 0 ; cnt < nPeople ; cnt++) 
{ 
    ABRecordRef ref = CFArrayGetValueAtIndex(allPeople, cnt); 

    NSString *firstName = (NSString *)ABRecordCopyValue(ref, kABPersonFirstNameProperty); 
    NSString *lastName = (NSString *)ABRecordCopyValue(ref, kABPersonLastNameProperty); 
    NSString *fullName; 

    /* skipped code at here : code to merge firstName and lastName to fullName. In my country, many of us don't separate first name and last name */ 

    // tempKeyString : NSString variable that has key of fullNameArray value for nameDictionary. 
    // fullNameArray : to keep some fullName variables for tempKeyString. 
    if (!tempKeyString) // there's no tempKeyString, a.k.a. it's the first fullName. 
    { 
     // it's not important to know about GetUTF8String:fullName. It's for my own language. 
     tempKeyString = [self GetUTF8String:fullName]; 
     [fullNameArray addObject:fullName]; 
    } 
    else 
    { 
     if ([tempKeyString characterAtIndex:0] == [[self GetUTF8String:fullName] characterAtIndex:0]) // if fullName has the same tempKey with fullNameArray. 
     { 
      [fullNameArray addObject:fullName]; 
     } 
     else // if fullName has different tempKey with fullNameArray. 
     { 
      //tempKey : key data for fullNameArray 
      NSString *tempKey = [tempKeyString substringToIndex:1]; 
      // tempDict : to keep the deep copy of nameDictionary before adding new key. 
      NSDictionary *tempDict = [nameDictionary mutableDeepCopy]; 
      // add new key (tempKey) with new value (fullNameArray) 
      // PROBLEM : ALL values (including previous values) in dictionary(nameDictionary) are overwritten to a new value(fullNameArray). 
      [nameDictionary setObject:fullNameArray forKey:tempKey]; 

      //empties fullNameArray so that it can get the new fullName of the new tempKey. 
      [fullNameArray removeAllObjects]; 
      //refresh tempKeyString, and add the new fullName. 
      tempKeyString = [self GetUTF8String:fullName]; 
      [fullNameArray addObject:fullName]; 
      ... 
     } 
    } 
} 

Я пытаюсь создать объект NSMutableDictionary из контактов моего iPhone. Почему я создаю типизированный объект NSMutableDictionary, так это то, что мне нужны индексы для контактов, и не просто сделать индексы из типизированного объекта ABAddressRef напрямую. Мне также необходимо выполнить функцию поиска.setObject: forKey: of NSMutableDictionary перезаписывает все данные в словаре

Не было проблем, когда я только что закодировал, но после отладки единственная проблема заставляет меня сходить с ума. После того, как я применил массив с именем fullNameArray с ключом tempKey к namedDictionary, я могу найти имяDictionary имеет все значения с ними fullNameArray. Все предыдущие данные были перезаписаны! Я попытался сделать глубокую скопированную версию предыдущего имениDictionary перед применением fullNameArray и скопировать его в новое имяDictionary. Однако, когда я проверил точку останова на третьей строке, я не могу найти предыдущие данные в tempDict.

Я добавил дополнительные коды и комментарии. Это может помочь больше, чем мое объяснение. Любые вопросы остались довольны!

Я попытался найти причину отсюда - StackOverflow - и другие веб-страницы всю ночь, но я не мог найти подобных проблем .. пожалуйста, помогите мне! Огромное спасибо заранее!!

+1

Может быть, лучше, если вы разместите больше кода и перефразите свой вопрос, я не понимаю ваш вопрос и ваш код, это просто не имеет смысла. –

+0

Спасибо, X Slash! Я новичок в использовании stackoverflow и задаю программные проблемы на английском языке. Я скоро изменю свою работу! –

ответ

2

Причина, почему это получить опустели, потому что

[nameDictionary setObject:fullNameArray forKey:tempKey]; 

здесь, вы создали свой словарь с объектом «fullNameArray», то

[fullNameArray removeAllObjects]; 

удалить все значения внутри этого массива, эффективно , удаляя ваш объект в «nameDictionary», они являются одним и тем же объектом, это не полная копия fullNameArray, которую вы храните внутри своего словаря. Почему вам все равно нужно было хранить что-либо в вашем массиве? Вы сохраняете только 1 значение.

[nameDictionary setObject:fullName forKey:tempKey]; 

будет делать то, что вам нужно. Извините, если я ошибся в вашем вопросе, довольно сложно понять

+0

Я мог бы получить подсказку из вашего ответа! Я не знал setObject: forkey: использует неглубокую копию, а не глубокую копию! Поэтому я сделал полную копию fullNameArray каждый раз и использовал их для setObject: forkey :. Теперь словарь показывает данные, которые я хотел! Большое вам спасибо за вашу помощь и идею! p.s. существует много значений для одного tempKey, поэтому мне нужно объединить их с одной переменной массива. Поэтому я использовал fullNameArray для объединения многих значений fullName. –

Смежные вопросы