2009-06-01 2 views
0

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

Я мог бы поставить свой код здесь, и у вас есть куча «У вас есть, что никогда не добирайтесь. Пулы Autorelease, бла-бла.

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

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

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

Любые мысли?

+0

Вы пробовали телефон или просто симулятор? Какова фактическая проблема, которая вызывает у вас 101 выход? –

ответ

2

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

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

1

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

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

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

[[[XMLReader alloc] init] autorelease] 

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

+0

Согласовано. Прочтите документы выпуска. Это приемлемое поведение. Вы пробовали экспериментировать как с телефоном, так и с симулятором? –

+0

У меня есть, и я также использую пример приложения UICatalog, чтобы подчеркнуть ObjectAlloc (в утечке). С помощью этого приложения запустите каждую страницу, кроме «веб», и следите за тем, чтобы память продолжала расти ... затем поднимите контроллер веб-представления и kaboom! Часть kaboom НЕ воспроизводится с утечками, работающими с симулятором, хотя память накапливается до некоторой точки высокой воды и, похоже, стабилизируется. Почему, например, у ImageView в UICatalog все еще есть активные ссылки, которые выкладываются после того, как их выскочили? Автоуслуги не используются. – Steve

Смежные вопросы