Как обнаружить вещи, которые не были выпущены должным образом - PullRequest
4 голосов
/ 08 августа 2011

Написание программы для iphone. Понял, что я забыл выпустить объект, но на самом деле не было никаких признаков того, что объект не был освобожден, все просто работало.

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

Ответы [ 5 ]

12 голосов
/ 08 августа 2011

Посмотрите на инструмент Leaks в Инструментах .

6 голосов
/ 08 августа 2011

Строго говоря, при выходе из программы не имеет значения, что вы оставили в памяти: система освобождает все, что ваше приложение выделяло на протяжении всей жизни. Однако, начиная с iOS 4, приложения обычно просто «зависают» в фоновом режиме и не закрываются, пока система не убьет их, чтобы освободить память. Чтобы этого избежать - и чтобы уменьшить объем занимаемой памяти вашего приложения, что важно во время его работы, - вам, как предположил Даниэль с высоким содержанием кофеина, следует использовать инструмент Instruments Leaks для проверки объектов, которые не освобождаются должным образом.

5 голосов
/ 09 августа 2011

Когда приложение закрывается, все в памяти уничтожается системой (не освобождается, а просто уничтожается, когда адресное пространство возвращается системе).

В то время как другие предлагали использовать инструмент «Утечки» для поиска утечек в вашем приложении, «Утечки» не найдут много разных видов увеличения памяти. Если объект размещен, помещен в кеш где-то, то ключ к этому объекту в кеше потерян, объект фактически утек (не может быть использован снова), но не будет обнаружен Утечками, потому что он все еще подключен к ваш жизнеспособный граф объектов.

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

Если вы хотите получить моментальный снимок непосредственно перед выходом из приложения, поместите sleep(1000); в свой код либо в обработчике завершения приложения, либо в другом месте, которое выполняется непосредственно перед выходом из приложения.

Только не забудьте удалить его перед отправкой производственной сборки. :)

3 голосов
/ 09 августа 2011

Ничего не существует в памяти при выходе из программы.Но вы можете начать с анализа своего кода (Product -> Analyse) и выполнения его с (Product -> Profile) Allocations или Leaks in Instruments, чтобы найти проблемы с управлением памятью.

3 голосов
/ 08 августа 2011

Как только приложение закрывается - у вас нет к нему доступа. Но инструменты (инструмент XCode) могут искать утечки памяти.

...