Сбои памяти в iOS с реальным использованием памяти только на 5 мг - PullRequest
1 голос
/ 27 октября 2010

Я некоторое время выискивал утечки памяти в своем приложении. На данный момент, когда я переключаюсь назад и вперед между двумя видами, наблюдая за инструментом монитора памяти, реальная память колеблется между 5 и 6 мегабайтами. Это все хорошо - насколько я могу судить, все становится правильно, когда я возвращаюсь из представления. Однако виртуальная память продолжает увеличиваться, и моя доступная реальная память быстро уменьшается каждый раз, когда я возвращаю представление обратно в стек представления (даже если реальное использование памяти приложением не увеличивается). В конечном итоге все это приводит к сбою памяти. Это явный признак какой-либо конкретной проблемы, или я просто где-то пропускаю утечку памяти?

РЕДАКТИРОВАТЬ: странная вещь, я получаю сбой памяти, в то время как приложение использует только около 5 мегабайт реальной памяти.

Ответы [ 5 ]

12 голосов
/ 30 октября 2010

Не используйте -retainCount.

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

Вы должны вызывать release ровно столько раз, сколько вы вызывали сохранение объекта.Не меньше (если вам не нравятся утечки) и, конечно же, больше нет (если вам не нравятся сбои).

См. Рекомендации по управлению памятью для получения полной информации.

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

Используйте инструмент Allocations.Сконфигурируйте его так, чтобы он отслеживал только оперативные распределения (так как вас не волнуют объекты, которые были освобождены).Сделайте что-нибудь с вашим приложением.Проверьте, о чем знает Allocations, и объясните, почему все эти объекты должны оставаться рядом.Вы можете использовать средства интеллектуального анализа данных для фильтрации только ваших объектов.

3 голосов
/ 17 декабря 2010

Другая причина, по которой у вас может быть потеря памяти на нижних уровнях API, заключается в том, что вы не удаляете все свои представления из иерархии представлений (иначе: не вызывайте [view removeFromSuperview] везде). По крайней мере, это то, что, казалось, случилось со мной.

Обратите внимание, что в большинстве случаев это не требуется, так как вы просто освобождаете основной вид и все его подпредставления, а затем перестраиваете его из контроллера представления при необходимости. Ситуация начинает усложняться, когда вы не освобождаете всю иерархию, а просто удаляете некоторые из них из иерархии.

В этом случае я пришел к выводу, что у вас могут быть буферы или слои, все еще кэшированные в более низких частях API, и в этом случае ваш инструмент Allocation вам не поможет. Для правильного мониторинга вам необходимо использовать «Монитор памяти» (в системе). Вы увидите, что линия «Physical Memory Free», сбрасываемая близко к 0, является наиболее надежным индикатором того, что будет выдано предупреждение Memory. Еще одним преимуществом использования этого инструмента является то, что вы можете подключить его к работающему процессу, что позволяет легко работать с консольным выходом и инструментом.

3 голосов
/ 28 октября 2010

В любом случае, вы также можете использовать опцию «Построить -> Построить и проанализировать», чтобы найти подозрительный нестандартный код.

2 голосов
/ 30 октября 2010

Циркулярные ссылки также не учитываются в утечках, но вы можете отслеживать их в распределениях. Лучше всего запустить распределение и перейти в состояние, в котором, по вашему мнению, все должно исчезнуть (или должны быть определенные объекты). Если они торчат, зайдите к ним, посмотрите, где они были сохранены, и рассмотрите правильное владение / освобождение памяти.

Что касается распределений, некоторые вещи, которые он не отслеживает, могут повлиять на общую память. Некоторые из них включают в себя несколько хранилищ CGImage, некоторые CoreAnimation и некоторые базы данных.

0 голосов
/ 27 октября 2010

Использовали ли вы инструмент производительности "Leaks"?И проверьте журналы в Организаторе, чтобы увидеть, есть ли там что-нибудь.

Также посмотрите на dealloc для контроллеров представления и убедитесь, что вы правильно выпускаете все его объекты?

...