ВАЖНО : оба вопроса (и мой код ниже) касаются очень специфического случая, в котором NSMutableDictionary содержит только массивы строк. Эти решения не будут работать для более сложных примеров. Для более общих решений случая см. Следующее:
Ответ для этого конкретного случая:
Ваш код должен работать, но вам определенно понадобится [oneCopy release]
. Новый словарь сохранит скопированные объекты при добавлении их с помощью setValue:forKey
, поэтому, если вы не вызовете [oneCopy release]
, все эти объекты будут сохранены дважды.
Хорошее эмпирическое правило: если вы alloc
, retain
или copy
что-то, вы также должны release
это.
Примечание: вот пример кода, который будет работать только для определенных случаев . Это работает, потому что ваш NSMutableDictionary содержит только массивы строк (дальнейшее глубокое копирование не требуется):
- (NSMutableDictionary *)mutableDeepCopy
{
NSMutableDictionary * ret = [[NSMutableDictionary alloc]
initWithCapacity:[self count]];
NSMutableArray * array;
for (id key in [self allKeys])
{
array = [(NSArray *)[self objectForKey:key] mutableCopy];
[ret setValue:array forKey:key];
[array release];
}
return ret;
}