Я пишу приложение (в iOS 5 с использованием ARC!), Которое представляет несколько сотен объектов в пользовательском UIViewController
Я написал, что пользователь может прокручивать и выбирать, каждый из которых представлен в виде эскиза что пользователь может коснуться.
С каждым из этих объектов связан специальный подкласс UIViewController
, который обрабатывает пользовательское представление информации, связанной с этим объектом. Например, это может быть изображение, которое можно увеличивать и панорамировать, или просто текст, который необходимо отформатировать.
Теперь с каждым из моих объектов изображения связано большое изображение. Используя приложение Instruments для профилирования моего кода и запуска Activity Monitor, я вижу, что они занимают примерно 5-10 МБ каждый при загрузке пользовательского подкласса UIViewController
и отображении изображения. Это хорошо для нескольких изображений, но в итоге мое приложение занимает слишком много памяти и вылетает.
Я написал в методе -viewDidUnload
моего подкласса, по-видимому, все, что нужно для того, чтобы ARC освободил эту память, но память не освобождается до тех пор, пока не будут выданы предупреждения, что обычно происходит, когда происходит сбой приложения. Пару раз я заметил, что если я подхожу достаточно близко к порогу, но не пересекаю его, подклассы UIViewController
, которые я ранее просматривал, в конечном итоге сбрасываются из памяти, хотя метод -viewDidUnload
явно не вызывается (скорее, сообщение -didReceiveMemoryWarning
отправляется на мой пользовательский UIViewControllers
). Однако чаще всего мое приложение вылетает из-за нехватки памяти.
Итак, мой основной вопрос заключается в том, должен ли я предполагать, что объект будет удален ARC как можно скорее, или он всегда ждет, пока пространство не станет ограниченным? Я хочу, чтобы пользовательский контроллер представления и его данные были сброшены сразу, так что память никогда не станет проблемой.
Я не верю, что существуют какие-либо сильные ссылки от объектов на мои контроллеры пользовательских представлений, и я создаю их экземпляры в своем основном контроллере представления, используя этот код:
[self presentViewController:[cObj grabModalViewController]
animated:YES completion:nil];
где cObj
- пользовательский класс с информацией об объекте. grabModalViewController
просто создает экземпляр объекта правильного типа и возвращает указатель, поэтому, вероятно, локальная ссылка на объект должна быть удалена, как только метод завершится.
В результате я ожидаю, что когда я позже позвоню
[self dismissModalViewControllerAnimated:YES];
пользовательский контроллер представления, который был указан только как основной контроллер представления через presentedViewController
, должен быть удален из памяти, но этого не происходит.
Может ли это быть из-за того, что у меня есть сильные ссылки в моем объекте контроллера пользовательского представления?
По сути, я пытаюсь избежать как можно большего количества предупреждений памяти, управляя вещами заранее, но, возможно, это неправильное отношение.
Буду признателен за любые предложения, и я рад опубликовать любой и весь код, который будет полезен.