UIImageView высвобождает ресурсы, когда их не видно? - PullRequest
1 голос
/ 31 января 2012

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

Если нет, я подумываю написать подкласс (например, SmartReleaseImageView), который будет использоваться в определенных ситуациях, когда это будет полезно.Я думал о поведении по следующим направлениям:

  • Когда SmartReleaseImageView получает сообщение setImage, оно регистрируется в диспетчере, например SmartReleaseImageViewManager.
  • Когда приложение получает памятьпредупреждение SmartReleaseImageViewManager перебирает все его SmartReleaseImageViews и проверяет, не добавлены ли какие-либо из них в суперпредставление, или проверяет, есть ли у любого из них кадр, который отбракован из-за того, что он находится за пределами основного окна.
  • Когда SmartReleaseImageView обнаруживает, что он появился и был выпущен, он загружает изображение снова.Поэтому, возможно, в первую очередь необходимо иметь такой метод, как setImageURL, а не setImage.

Этот тип поведения уже встроен в UIImageView?Или он существует в сторонней версии где-нибудь?Или есть проблема с идеей?

(я пишу тяжелое приложение UIImageView, и было бы неплохо иметь глобальное всеобъемлющее решение, которое помогло бы с ситуацией с памятью, а не добавляло многодополнительного кода к моему UIViewControllers.)

РЕДАКТИРОВАТЬ : Ответы на данный момент предполагают, что UIViewController должен нести ответственность.Это правда, и я думаю, что мой конкретный случай нетипичен.В моем случае UIViewController может содержать множество пользовательских представлений (со своей собственной иерархией), которые не обязательно знают структуру и которые часто входят и выходят из вида.Поэтому ему трудно знать, когда высвобождать свои ресурсы.Но да, возможно, я должен найти способ решить эту проблему сам ...

Ответы [ 2 ]

1 голос
/ 31 января 2012

Краткий ответ:
UIImageView не освобождает ресурсы, никогда.
Но все ваши представления (включая UIImageView) освобождаются, когда системе требуется больше памяти. Обратите внимание, что вы должны освободить ваши взгляды в [UIViewController viewDidUnload].

Edit: К сожалению, он не работает, когда контроллер не отображается. В этом случае я предлагаю очистить компоненты вручную в viewDidDissappear (вызовите viewDidUnload вручную и удалите компоненты из иерархии представления).

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

1 голос
/ 31 января 2012

Ну, на самом деле это автоматическое управление реализовано в UIViewController.Поскольку UIImageView является подклассом UIView, ваш контроллер представления должен иметь возможность управлять им автоматически.

Управление памятью

Память является критически важным ресурсом в iOS, и контроллеры представления предоставляют встроенныев поддержку уменьшения их памяти в критические моменты.Класс UIViewController обеспечивает некоторую автоматическую обработку условий нехватки памяти через его метод didReceiveMemoryWarning, который освобождает ненужную память.До iOS 3.0 этот метод был единственным способом высвободить дополнительную память, связанную с вашим пользовательским классом контроллера представления, но в iOS 3.0 и более поздних версиях метод viewDidUnload может быть более подходящим местом для большинства потребностей.

КогдаПредупреждение о нехватке памяти происходит, класс UIViewController очищает свои представления, если он знает, что может перезагрузить или воссоздать их позже.Если это происходит, он также вызывает метод viewDidUnload, чтобы дать вашему коду возможность отказаться от владения любыми объектами, связанными с вашей иерархией представления, включая объекты, загруженные с помощью файла nib, объекты, созданные в вашем методе viewDidLoad, и объекты, созданные лениво ввремя выполнения и добавлено в иерархию представлений.Как правило, если ваш контроллер представления содержит выходы (свойства или необработанные переменные, содержащие ключевое слово IBOutlet), вы должны использовать метод viewDidUnload, чтобы отказаться от владения этими выходами или любыми другими данными, относящимися к представлению, которые вам больше не нужны.

источник: http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...