2010-08-26 2 views
3

Что вызывает утечку в этом коде? Я действительно не могу этого понять. В строках: 1: NSMutableArray * days = [[NSMutableArray alloc] init]; 2: [dic setObject: days forKey: key]; 3: [days addObject: значение];Что вызывает утечку памяти?

Весь метод:

-(void) addValueToDictionary: (NSMutableDictionary *) dic withValue: (NSNumber *) value forKey: (NSString *) key { 
NSMutableArray * days = [dic objectForKey:key]; 
if (days == nil) { 
    NSMutableArray * days = [[NSMutableArray alloc]init]; 
    [days addObject:value]; 
    [dic setObject:days forKey:key]; 
    [days release]; 
    days = nil; 
} 
else { 
    [days addObject:value]; 
} 

}

BR // Кристоффер

ответ

1

Проверьте, не выпущен ли dic. Вы должны NSLog keepCount раньше, чем считаете окончательные версии, и убедитесь, что они равны 1 перед окончательной версией.

Кроме того, запустите сборку и анализ, чтобы убедиться, что вы правильно освобождаетесь. Встроенная функция Build and Analyze не обнаруживает столько утечек, что работает с проверкой-сборкой со всеми проверками, поэтому изучите установку scan-build в Xcode.

Using an external Xcode Clang Static Analyzer binary, with additional checks

+0

Забудьте о сохранить счет. В лучшем случае это вводит в заблуждение. Вы должны использовать инструменты отладки памяти Apple и статический анализатор для выявления причин утечек. – JeremyP

+1

Почему, на ваш взгляд, saveCount вводит в заблуждение? В какой-то момент, когда вы отлаживаетесь, если вы проверите то, что, по вашему мнению, будет иметь окончательный выпуск (о котором вы часто это понимаете) - keepCount должен быть один прямо перед ним. Если нет, вы, возможно, забыли релиз где-то в другом месте. –

0

Вы пытались изменить имя переменной NSMutableArray дней * в пределах если? Из-за этого вы не получите предупреждение?

0

Там нет ничего плохого в том, что определенной части коды (кроме немногих сомнительного переопределения дней во внутреннем объеме). Где-то еще вы сохраняете, но забываете освободить объект, который вы помещаете в словарь.

1

Вы должны получить предупреждение о повторном объявлении days. Это может привести к утечке утечки, если вы используете статический анализатор. Модифицированный метод ниже. В основном меняется стиль кодирования с добавлением небольшого защитного кода.

-(void) addValueToDictionary: (NSMutableDictionary *) dic withValue: (NSNumber *) value forKey: (NSString *) key 
{ 
    if (nil == dic || nil == key || nil == value) return; // bail out on nil parameters 
    if (![dic objectForKey:key]) { 
     NSMutableArray * days = [[NSMutableArray alloc] init]; 
     [dic setObject:days forKey:key]; 
     [days release]; 
    } 
    [[dic objectForKey:key] addObject:value]; 
} 
0

изменения инициализации NSMutableArray в ...

NSMutableArray * days = [NSMutableArray array]; 
Смежные вопросы