Учет использования памяти в приложении на основе навигационного контроллера;


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

Теперь в утечках у меня есть чистый лист. Нет утечки памяти, не так трудно сделать с функцией статического анализа 10.6 и подтверждено с помощью инструментов. Проверяя вручную, я уверен, что да. выпустив все, что выделено в viewWillAppear в viewWillDisappear; все выделено в метод viewDidLoad в viewDidUnload; все выделенные иначе в dealloc.

Я использовал NSZombiesEnabled в разработке, но у меня определенно нет его активного сейчас.

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

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

1   2   2009-11-20 08:10:54

1 ответ:

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

При таком подходе, я думаю, вы будете использовать управление памятью фреймворка вместо того, чтобы пытаться свернуть свой собственный и потенциально вводить долгосрочные ошибки памяти:)

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

Надеюсь, что это было хотя бы что-то рассмотреть:)