По аналогии с известной проблемой утечки памяти, связанной с созданием и уничтожением экземпляра UIImagePickerController, я нахожу аналогичные проблемы в отношении экземпляров класса UIViewController. Рекомендуемый способ использования UIImagePickerController состоит в том, чтобы создать экземпляр один раз и хранить его в течение всего срока службы приложения, даже если это израсходует память, которая может вам понадобиться в другом месте.
Ситуация, с которой я имею дело, включает в себя 2 экземпляра класса UIViewController. При запуске создается первый экземпляр, и его представление добавляется в другой «главный» класс UIViewController, который является частью MainWindow.xib. На этом первом экземпляре есть кнопка «информация», которая при нажатии переключается на новый экземпляр класса UIViewController (если он еще не был создан). «Основной» UIViewController управляет этим переключением с помощью обычной анимации. Основные настройки можно увидеть в книге Дейва Марка «Начало разработки iPhone: изучение iPhone SDK».
Проблема, которая возникает, заключается в том, что после первого нажатия кнопки «информация» память выделяется для нового второго экземпляра UIViewController и не освобождается до тех пор, пока приложение не завершится. Из-за количества элементов в этом информационном представлении он использует приблизительно 1 МБ памяти после создания экземпляра, и его представление добавляется в суперпредставление. Любые попытки последовательно уничтожить и воссоздать этот экземпляр приводят к утечке памяти, аналогичной той, которая существует, если вы пытаетесь сделать то же самое с экземплярами класса UIImagePickerController. Я подозреваю, что первопричина между двумя классами одинакова.
Суть моей проблемы заключается в необходимости освободить как можно больше памяти, прежде чем я позволю пользователю делать снимок с помощью камеры. Однако, как только пользователь сделал снимок и увидит полученное изображение с первого раза, ему разрешается нажать на кнопку «информация», которая существует в первом экземпляре UIViewController. При нажатии «основной» UIViewController удаляет существующее представление UIViewController и заменяет его на представление для информационного экрана. На информационном экране есть кнопка «назад» для переключения просмотра назад. Однако, как только пользователь покидает информационный экран и выбирает сделать еще один снимок с камеры, память, выделенная для информационного экрана, все еще находится в памяти.
Класс UIImagePickerController временно использует почти 15-18 МБ, в то время как он обрабатывает 2-мегапиксельное изображение перед освобождением своих внутренних ссылок и вызывается делегат "imagePickerController: didFinishPickingImage". Я сталкиваюсь с предупреждениями о нехватке памяти, как только второй экземпляр UIViewController был создан с помощью кнопки «Информация», а затем пользователь решает сделать еще одну фотографию.
Технически память не протекает независимо от того, выполняете ли вы снимки снова и снова с помощью или без нажатия кнопки «Информация» в моем случае, но из-за других проблем, связанных с фоновыми процессами на iPhone (Safari и т. Д.), Которые вы не можете контролировать, вы ДОЛЖНЫ освободить как можно больше памяти при работе с такими вещами, как камера.
Какой-нибудь совет, как правильно создавать и уничтожать экземпляры класса UIViewController, чтобы память не протекала?