Предупреждение об утечке памяти я не могу решить - PullRequest
3 голосов
/ 15 февраля 2010

Статический анализатор обнаруживает утечку в этом блоке кода (в частности, ссылку с копией в нем):

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI 
 qualifiedName:(NSString *)qName
{
    if ([elementName isEqualToString:@"item"]) 
    {
        [elements setObject:title forKey:@"title"];
        [elements setObject:date forKey:@"date"];
        [elements setObject:summary forKey:@"summary"];
        [elements setObject:link forKey:@"link"];

        [posts addObject:[elements copy]];
    }
}

Я попытался выпустить скопированный объект, но все равно получил предупреждение. Я что-то упустил?

Спасибо

Ответы [ 2 ]

5 голосов
/ 15 февраля 2010

Вы создали новую копию, которую не выпускаете.

Возвращает новый elements объект с номером ссылки 1, который вы обязаны освободить, поскольку вы только что создали копию:

[elements copy];

В этой строке вы добавляете новую созданную копию в posts, которая выглядит как коллекция. Все коллекции сохраняют новые значения, поэтому вы передаете новую копию с номером ссылки 1, а сообщения увеличивают количество ссылок до 2, сохраняя ее.

[posts addObject:[elements copy]];

При выпуске posts отправит каждому элементу release, что уменьшит количество ссылок до 1, так что elements не будет освобожден, и вы получите утечку памяти.

Удалите copy и посмотрите, поможет ли это:

[post addObject:elements];
3 голосов
/ 15 февраля 2010

Просто чтобы сделать одно замечание совершенно ясным:

Я пытался освободить скопированный объект, но все равно получаю предупреждение.

Вы имеете в виду, что пытались это сделать?

    [posts addObject:[elements copy]];
    [elements release];

Это не решает проблему и может вызвать вторую проблему.

Проблема, с которой вы начали, заключается в том, что вы пропускаете копию - объект, который вернул метод copy, объект, который вы добавили в posts. Эта проблема остается: Вы не выпустили копию.

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

Возможно, вы захотите вместо этого отправить elements a removeAllObjects сообщение; это будет держать объект вокруг, но опустошит его при подготовке к следующему элементу.

В несвязанной заметке вы также можете переименовать elements, чтобы более точно отразить ее словарную природу и абстрагировать ее от XML-представления. «elements» звучит как массив для меня. «feedItemProperties» может быть более подходящим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...