Понимание управления памятью с выпуском NSDictionary - PullRequest
0 голосов
/ 14 февраля 2011

Управление памятью в iOS все еще странное для меня, но это самый интересный аспект для меня, поэтому я прошу помощи здесь с моим кодом.

Я пытаюсь создать экземпляр объекта NSDictionary, я использую его, затем хочу выпустить, но я получил ошибку освобождения объекта, это код:

if ([jsonArray count] > 0) {        
    NSDictionary *commentDictionary = [[NSDictionary alloc]init];
    int i;
    for (i = 0; i < [jsonArray count]; i++) {
        commentDictionary = [jsonArray objectAtIndex:i];
        NSLog(@"debugging message here"]);
        commentLabel.text = [commentDictionary objectForKey:@"commentText"];
        //[commentDictionary retain];
    }
    //[commentDictionary release];
    commentDictionary = nil;
    NSLog(@"NSDictionary retainCount = %d",[commentDictionary retainCount]);
}

Ничего особенного, я заполняю словарь из массива, в моем коде вы можете видеть, что я пытался выпустить, но я закомментировал из-за ошибки. Почему я не могу выпустить словарь?

Кроме того, в чем разница между установкой NSDictionary равным nil, который возвращает ноль в retainCount и release (что должно составлять счет -1)?

Заранее большое спасибо за любую помощь в этой теме.

Фабрицио

Ответы [ 2 ]

11 голосов
/ 14 февраля 2011

Не вызывайте retainCount

retainCount - это ужасный метод, который нужно использовать для того, чтобы понять управление памятью.Абсолютное количество сохраняемых объектов редко представляет интерес и часто будет непостижимо из-за деталей реализации.

Прочитайте документацию .Это довольно просто.

Теперь к вашему коду.

  • назначение alloc / init для commentDictionary в вашей первой строке не требуется, и этот объект будетбыть утечкой в ​​назначении, которое является первой строкой в ​​цикле for().

  • вместо использования для (;;), вы можете использовать for(commentDictionary in jsonArray) {...}

  • нет никаких причин сохранять или освобождать commentDictionary в этом коде;объект, извлеченный из массива, останется действительным во всей области действия этого метода.

  • Objective-C - это язык "nil eats messages".Когда вы вызываете метод на nil, этот вызов вернет 0 почти во всех случаях.

О, и что сказал Кирилл.Статический анализатор - замечательный инструмент!

2 голосов
/ 15 февраля 2011

Я советую вам запустить статический анализатор для этого кода: многие ошибки, которые я делаю в отношении управления памятью, объясняются выполнением шагов, которые маленькие синие стрелки описать.

Это очень полезный / крутой / прощающий инструмент для выявления собственных ошибок и понимания происходящего. Сборка и анализ в меню сборки.

PS: retainCount часто неверен;

...