2012-04-18 1 views
0

нужно сделать копию NSMutableDictionary по:скопированных NSMutableDictionary не изменяемые

NSMutableDictionary *newScoutingEventDictionary = [[[NSMutableDictionary alloc] initWithDictionary:self.scoutingEvent copyItems:YES] mutableCopy]; 

, но когда я пытаюсь мутировать массив в нем:

[[newScoutingEventDictionary objectForKey:@"myArray"] replaceObjectAtIndex:i withObject:appendedEntry]; 

это дает мне ошибку:

-[__NSArrayI replaceObjectAtIndex:withObject:]: unrecognized selector sent to instance 0x964d650 
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI replaceObjectAtIndex:withObject:]: unrecognized selector sent to instance 0x964d650' 

если я пытаюсь мутировать оригинал NSMutableDictionary:

[[self.scoutingEvent objectForKey:@"myArray"] replaceObjectAtIndex:i withObject:appendedEntry]; 

все работает отлично. почему моя скопированная версия ломает его?

+3

Я должен указать, что 'NSMutableDictionary * newScoutingEventDictionary = [[[NSMutableDictionary alloc] initWithDictionary: self.scoutingEvent copyItems: YES] mutableCopy];' фактически делает две копии, первая из которых просочилась ... –

+0

er ... . как так? я не вижу/не понимаю. – Padin215

+1

Чтобы быть точным, он создает два новых экземпляра из [основных правил управления памятью] (https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html#// apple_ref/doc/uid/20000994-BAJHFBGH), «alloc» означает, что создается один экземпляр, а «mutableCopy» - второй. –

ответ

5

mutableCopy делает a неглубокий изменчивый экземпляр. Он не собирается превращать неизменяемые объекты в словарь mutable.

Вам необходимо реализовать - да, реализовать, поскольку он не является частью API по разным причинам - глубокое переключение с возможностью копирования, если это то, что вам нужно.

В качестве альтернативы, если ваш словарь может быть представлен как список свойств, вы можете превратить его в один, а затем использовать различные параметры параметров для создания изменчивых коллекций и/или листьев, когда они не будут сохранены.

+0

Я играл с ним, я удалил mutableCopy и установил copyItem в no (в основном просто используйте метод initWithDiciontary:). Теперь у меня есть копия исходного словаря. Я могу изменить копию (replaceObjectAtIndex :), и оригинал не изменяется. :? – Padin215