Обращаясь сначала ко второму вопросу, вместо [[NSMutableDictionary alloc] initWithCapacity:[self count]]
вы можете использовать [NSMutableDictionary dictionaryWithCapacity:[self count]]
, который вернет автоматически выпущенный объект, и вам придется сохранить его самостоятельно в вызывающем коде.
С другой стороны, вы можете переименовать ваш метод, чтобы начать со слова copy, если вы хотите, чтобы он возвращал сохраненный объект, а не выдавать ошибки - , что я думаю, именно то, что вы хотите сделать в этом случае . Остальная часть моего ответа предполагает, что вы выбрали этот путь.
Мой первоначальный ответ был следующим: вы не выпускаете oneCopy в конце каждой итерации. Попробуйте добавить [oneCopy release];
сразу после [ret setValue:oneCopy forKey:key];
.
Однако, как указывает Александр Акерс , компилятор считает, что -mutableDeepCopy имеет 0 счет. Таким образом, если вы переименуете, как предложено выше, и включите [oneCopy release]
, как я изначально предлагал, это должно решить обе проблемы. Если это не так, обязательно посмотрите некоторые другие решения в вопросе, на который он ссылался.
Пример:
@implementation NSDictionary(DeepMutableCopy)
-(NSMutableDictionary *)copyWithDeepCopiedValues
{
NSMutableDictionary *ret = [[NSMutableDictionary alloc] initWithCapacity:[self count]];
NSArray *keys = [self allKeys];
for (id key in keys)
{
id oneValue = [self valueForKey:key];
id oneCopy = nil;
if ([oneValue respondsToSelector:@selector(mutableDeepCopy)])
oneCopy = [oneValue copyWithDeepCopiedValues];
else if ([oneValue respondsToSelector:@selector(mutableCopy)])
oneCopy = [oneValue mutableCopy];
if (oneCopy == nil)
oneCopy = [oneValue copy];
[ret setObject:oneCopy forKey:key];
[oneCopy release];
}
return ret;
}
@end