Вам необходимо проанализировать это в свете правил управления памятью Apple .
Начиная с этой строки:
self.mutableDictionary = [self.immutableDictionary mutableDeepCopy];
Я ожидаю, что mutableDeepCopy вернет объект, который у меня есть, поэтому в какой-то момент мне нужно освободить или автоматически освободить его. например, * +1008 *
NSMutableDeepCopy* temp = [self.immutableDictionary mutableDeepCopy];
self.mutableDictionary = temp;
[temp release];
или
self.mutableDictionary = [[self.immutableDictionary mutableDeepCopy] autorelease];
Так что теперь нам нужно взглянуть на mutableDeepCopy. Поскольку в названии есть «копия», ему необходимо вернуть «принадлежащий» объект, что на практике означает «забыть» освободить возвращенный объект. Вы уже не смогли этого сделать при создании возвращенного объекта в первой строке, так как dictionaryWithCapacity: дает вам объект, которым вы не владеете. Замените его на
NSMutableDictionary *dictionaryToReturn = [[NSMutableDictionary alloc] initWithCapacity:[self count]];
Теперь он у вас есть.
Важно, чтобы ваша mutableDeepCopy подчинялась правилам, поскольку это означает, что вы можете обрабатывать объекты, возвращенные из mutableDeepCopy, mutableCopy и копировать точно таким же образом. Во всех трех случаях вам принадлежит копия объекта, которую вы вставляете в массив. Поскольку вы владеете им, вы должны освободить его, или он протечет, как вы узнали. Итак, в конце цикла вам нужно
[copy release];
Это остановит утечку.