Добавление объекта в NSArray - утечка, но почему? - PullRequest
0 голосов
/ 21 декабря 2011

У меня есть класс, который содержит NSMutableArray с именем _contents. Этот массив инициализируется при создании экземпляра этого класса, и существует метод setContentsObject: для добавления объекта к содержимому. Это реализация setContentsObject:

- (void)addContentsObject:(id <MyProtocol>)object
{
    [_contents addObject:object];
}

Довольно просто, и это работает, но когда я анализирую работу моего приложения с помощью инструмента «Утечки», я получаю сообщаемую утечку (помеченную как «100%») в одной строке этого метода. Я понимаю, что addObject: сохраняет объект, но у меня никогда не было этой проблемы раньше, и я не вижу, что еще можно сделать с этим методом.

Ответы [ 3 ]

0 голосов
/ 21 декабря 2011

Я сталкивался с случаями, когда addObject просачивается и просто заменяет эту строку на insertObject: atIndex исправляет ее. Я даже доказал это, выполнив несколько тестов на утечки.

Теперь, могу я дать вам точную причину, почему и когда она протекает? Не совсем ... Я могу сделать предположение и сказать, что последнее более точно. Я точно знаю, что это исправило мою проблему и просто классифицировало ее как ошибку:)

0 голосов
/ 21 декабря 2011

Невозможно сказать без дополнительного кода.Но addObject: сохранит то, что вы передаете.Таким образом, вы можете считать, что массив «владеет» объектом, и вы можете освободить его после вызова метода addContentsObject:.

И, как уже упоминалось в «Hot Licks», если никто не освобождает массив, все объекты, которыми он владееттакже будет висеть вокруг.

Что вы можете сделать с инструментом «Утечки», так это посмотреть на один из ваших утечек и посмотреть все ссылки.

О, и вы можете захотетьрассмотрите возможность перехода на ARC.

0 голосов
/ 21 декабря 2011

Я почти уверен, что это связано с тем, как Obj-C смотрит на имена методов. Все, что имеет префикс -copy -add или -new, добавит счетчик сохранности к вашему возвращенному объекту. Если вы не хотите, чтобы это происходило таким образом, попробуйте переименовать метод один раз и посмотреть, все ли течет. Я думаю, это не так.

...