Выпуск NSObject ... По-прежнему отображается в ObjectAlloc - PullRequest
0 голосов
/ 01 июня 2009

Я отслеживал, почему ссылки на NSObject, хотя и были явно выпущены, все еще отображаются в ObjectAlloc. Фактически, мы сократили NSObject до базовой оболочки, с [[myObject alloc] init], сразу за которым следует [myObject release], и ​​это не похоже на то, что оно выпускается в ObjectAlloc. Это большая проблема с приложением NavigationController, которое выдвигает / выдвигает несколько контроллеров представлений, поскольку недавно запущенные контроллеры представлений не выпускаются из-за этих «невыпущенных» ссылок NSObject. Hmmmmmm.

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

Итак, давайте посмотрим на пример приложения SeismicXML от Apple ... запустите его в ObjectAlloc / Leaks. Очень простой в getEarthquakeData:

XMLReader *streamingParser = [[XMLReader alloc] init];
[streamingParser parseXMLFileAtURL:[NSURL URLWithString:feedURLString] parseError:&parseError];
[streamingParser release];        

Я вижу тонну мусора, лежащего в ObjectAlloc из XMLReader, несмотря на его выпуск. Бьюсь об заклад, если мы добавим кнопку «Обновить» в это приложение, чтобы снова вызвать «getEarthquakeData», мы бы потерпели крах приложения в течение 5 обновлений.

Есть мысли?

Ответы [ 2 ]

2 голосов
/ 01 июня 2009

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

Инструмент, который, я думаю, вам нужен, называется «Утечки», который показывает вам, какая память просачивается из-за отсутствия какой-либо ссылки на него. То есть указатели на объекты, которые не были отправлены release-dealloc до их переназначения.

1 голос
/ 01 июня 2009

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

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

Другая проблема может заключаться в том, что ваш объект никогда не освобождается. Если вы получите исключение между + alloc и -release, вы получите утечку. Чтобы исправить это, используйте вместо этого:

[[[XMLReader alloc] init] autorelease]

Наконец, вы можете поработать со сборкой мусора здесь. Я не знаю достаточно о системе GC, чтобы сказать вам, какое поведение вы должны ожидать.

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