Obj-C: retainCount> 1 в методе dealloc? - PullRequest
0 голосов
/ 23 июня 2010

Если счет сохранения (ссылки) объекта больше 1 в методе dealloc перед выпуском, значит ли это, что будет утечка памяти?

Я отлаживал свой код, чтобы найти другую проблему, но затем столкнулся с этой тонкой. Один из счетчиков сохранения моего объекта был 3 в методе dealloc. Этот объект является свойством с сохранением и вызывается только внутри класса. Теперь я представляю, что количество сохранений должно быть 1 для всех объектов в методе dealloc перед освобождением, верно?

Вот пример метода dealloc в пользовательском классе:

- (void)dealloc {
    // Prints: "myObject retaincount: 3"
    NSLog(@"myObject retaincount: %d", [myObject retainCount]);

    // myObject retain count will be 2 after this call
    [myObject release];

    [super dealloc];
}

Это нормально?

Ответы [ 3 ]

6 голосов
/ 24 июня 2010

От Apple относительно -retainCount:

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

2 голосов
/ 23 июня 2010

Если myObject передается какому-либо другому объекту (скажем, anObj) через метод (скажем, «метод:»), как в

 [anObj method:myObject];

anObj, при необходимости можно сохранить myObject,Тогда совершенно разумно, что когда вызывается dealloc объекта, содержащего myObject, счетчик сохранения myObject превышает 1.

Ваш код все еще в порядке: ответственность за содержащий объектrelease владение, когда это сделано с ним.После [myObject release], myObject не будет освобожден.Вместо этого он будет освобожден, когда anObj выпустит его.

0 голосов
/ 24 июня 2010

Что вы хотите сделать вместо того, чтобы распечатывать счетчик хранения, это запустить инструмент ObjectAlloc для вашего кода с включенным подсчетом ссылок (нажмите на (i) на инструменте и перезапустите инструмент, записывающий ваше приложение).

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

Еще одной быстрой проверкой было бы установить точку останова или поместить журнал в dealloc любого класса myObject, чтобы вы могли непосредственно видеть, освобождается ли объект, когда вы этого ожидаете - возможно, он все еще получилтам сохраняется большее количество сохраняемых данных, но после освобождения пула автоматического выпуска он исчезнет.

...