Как повысить эффективность использования памяти с помощью вкладок и контроллеров навигации? - PullRequest
0 голосов
/ 06 августа 2009

Фон: У меня есть контроллер панели вкладок, который в настоящее время содержит 4 вкладки. 3 из вкладок являются контроллерами навигации, которые отображают иерархию табличных представлений для просмотра, редактирования и создания данных. Данные, как правило, представляют собой строки NSS, которые берутся у пользователя и хранятся в глобальной переменной (доступ к данным должен осуществляться из нескольких представлений в иерархии, а также из нескольких вкладок).

Проблема Я заметил, что мое приложение использует довольно много памяти, как только оно запускается (~ 11 МБ ). Однако, когда я прокручиваю представления таблицы и использую контроллер nav для доступа к другим представлениям таблицы и редактирования некоторых данных, использование памяти быстро достигает почти 20 МБ. Хуже всего то, что отказ от контроллеров подробного представления не приводит к уменьшению использования памяти. Он будет колебаться вокруг 20-21mb , и, если я повторю процесс, я, похоже, получаю все больше и больше использования памяти. Я протестировал свое приложение в Leaks и решил все проблемы там. Я подозреваю, что мои неактивные контроллеры представления все еще находятся в памяти, даже если они не отображаются в данный момент. Есть ли способ освободить ненужные контроллеры представления в иерархии контроллера навигации или даже неактивные контроллеры представления из панели вкладок? Я читал документы Apple, и они настоятельно рекомендуют реализовать didReceiveMemoryWarning: и applicationDidReceiveMemoryWarning: в контроллерах представления и делегате приложения. Я действительно не знаю, с чего начать с этими методами. Какие контроллеры я могу выпустить и как их воссоздать? Я предполагаю, что я несу ответственность за это, но я хотел бы быть уверен.

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

Ответы [ 2 ]

3 голосов
/ 06 августа 2009

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

Поднимите инструменты с шаблоном Object Allocations и посмотрите, что съедает большую часть вашей памяти. Посмотрите, что еще в памяти, что не должно быть. Если вы считаете, что вашим контроллерам представлений не хватает памяти, введите NSLog() в их -dealloc и убедитесь, что они действительно выходят из памяти.

Вы должны реализовать didReceiveMemoryWarning в своих контроллерах представления, и Apple дает указания о том, как реализовать это в Управление памятью объектов Nib . По крайней мере, вы должны реализовать оператор ведения журнала в didReceiveMemoryWarning, чтобы вы знали, получаете ли вы предупреждения. Но это вряд ли актуальная проблема. Невыполнение этого метода не приводит к утечкам памяти, оно просто препятствует тому, чтобы вы освобождали память так быстро, как вы могли бы в ситуациях с нехваткой памяти.

Соблюдаете ли вы правило № 1 управления памятью какао: вы должны использовать средства доступа? Не связывайтесь напрямую с переменными вашего экземпляра, и большинство проблем с управлением памятью исчезнет.

0 голосов
/ 06 августа 2009

На самом деле, в iPhone OS 3.0+ UIViewController подклассы обычно должны просто реализовывать viewDidUnload вместо didReceiveMemoryWarning. Он автоматически вызывается в системах с малым объемом памяти, если текущее представление UIViewController не отображается. Вы должны выпустить такие вещи, как IBOutlets, что приведет к тому, что фактические представления будут освобождены, что хорошо, так как если они снова будут отображаться, сначала будет вызван viewDidLoad.

didReceiveMemoryWarning по-прежнему уместно в некоторых случаях, если у вас есть какая-то память, которую вы можете сбросить, даже когда отображается UIViewController (например, кэши).

...