iPhone ... Если у вас есть NSArray из NSMutableDictionaries, содержит ли Array ссылку на dict или «копию»? - PullRequest
1 голос
/ 25 июня 2010

Ладно, если исходить из Perl, я привык к тому, что массивы держат ссылки на хэши (словарь на iPhone).

Я хотел бы знать следующее: если у меня есть NSArray из NSMutableDictionaries. Скажем, я добавил следующий NSMutableDictionary к NSArray:

[theArray addObject:[[NSMutableDictionary alloc] initWithObjectsAndKeys: timestamp, @"timestamp" ,name, @"name" ,lat, @"lat" ,lon, @"lon" , nil]];

Затем я перебрал массив так:

for (NSMutableDictionary theDict in theArray)
{

}

каждый theDict представляет указатель данных NSMutableDictionary, так что я могу сделать это:

for (NSMutableDictionary *theDict in theArray)
{
      if ([theDict objectForKey:@"timestamp"] != nil && [[theDict objectForKey:@"timestamp"] isEqualToString:@"timestamp"])
      {
           [theDict setObject:@"new name" forKey@"name"];
      }   
}

и затем ожидать, что theArray будет хранить измененное значение в течение всего срока действия массива?

или мне нужно сделать следующее:

int ct = 0;
for (NSMutableDictionary *theDict in theArray)
{
      if ([theDict objectForKey:@"name"] != nil && [[theDict objectForKey:@"name"] isEqualToString:@"name you want to change"])
      {
           NSMutableDictionary *tmpDict = [[NSMutableDictionary alloc] initWithDictionary:theDict copyItems:YES];
           [tmpDict setObject:@"new name" forKey@"name"];
           [theDict replaceObjectAtIndex:ct withObject:tmpDict];
           [tmpDict release];
           break;
      }
      ct += 1;
}

Это не может быть весь этот код, не так ли? просто заменить одно значение для ключа NSMutableDictionary, хранящегося в NSArray?

Извините, если этот вопрос очевиден для некоторых ... но все еще пытаюсь обернуть мой разум вокруг указателя на словарь (или объект) в Objective-c - с примерно эквивалентен ссылке на хеш в perl vs копия (или глубокая копия) объекта в Objective-c. И проблема становится еще более запутанной NSArray, держащим указатели (надеюсь) на NSMutableDictionaries. Вот как это делается в perl - и из того, что я понимаю, - вне имени (указатель против ссылки) .. то же самое в Objective-c.

1 Ответ

1 голос
/ 25 июня 2010

Вы должны сделать это первым способом. Каждый theDict является указателем на оригинал, а не копией.

Редактировать: остаток ответа больше не актуален после редактирования вопроса, но оставлен вокруг для предоставления контекста для комментариев и потому что у вас никогда не может быть слишком много ссылок на документы владения объектом!


Ваше autorelease vs release в стороне предполагает возможное недоразумение о чем-то другом, но, возможно, сейчас не время вдаваться в подробности. Я предлагаю вам еще раз взглянуть на документы о владении объектами , чтобы убедиться, что вы понимаете, что на самом деле означает autorelease.

(Кстати, ваш начальный tmpArray должен быть theArray Я думаю, если только я полностью не понял ваш вопрос. И тип переменных цикла должен быть NSMutableDictionary*, а не NSMutableDictionary.)

...