Что вызывает утечки памяти? - PullRequest
3 голосов
/ 26 августа 2010

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

Весь метод:

-(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 // Christoffer

Ответы [ 5 ]

1 голос
/ 26 августа 2010

Вы должны получить предупреждение о повторном объявлении 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];
}
1 голос
/ 26 августа 2010

Убедитесь, что dic выпущен. Вы должны NSLog retainCount до того места, где вы думаете о финальных выпусках, и убедиться, что они равны 1 непосредственно перед финальным выпуском.

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

Использование внешнего двоичного файла статического анализатора Xcode Clang с дополнительными проверками

0 голосов
/ 22 ноября 2011

изменить инициализацию NSMutableArray на ...

NSMutableArray * days = [NSMutableArray array];
0 голосов
/ 26 августа 2010

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

0 голосов
/ 26 августа 2010

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

...