iOS - проблемы управления ARC / памятью с помощью ModalViewControllers - PullRequest
3 голосов
/ 09 января 2012

Я пишу приложение (в 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, должен быть удален из памяти, но этого не происходит.

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

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

Буду признателен за любые предложения, и я рад опубликовать любой и весь код, который будет полезен.

1 Ответ

5 голосов
/ 10 января 2012

Итак, мой основной вопрос, должен ли я предполагать, что объект будет Утилизировать ARC как можно скорее, или она всегда ожидает пространство становится тесным?

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

...