Удаление UIImage и CGImage

Нужно ли удалять UIImage и CGImage в приложении MonoTouch после того, как я закончу с ними работать? Каковы последствия удаления любого из них?

Безопасно ли избавляться от любого из них, если изображение все еще видно?


person Dan Abramov    schedule 07.10.2012    source источник


Ответы (1)


Я предлагаю использовать блок using для таких изображений:

using (var image = UIImage.FromFile ("demo.png"))
{
    //do something with your image here
    //such as passing it to an UIImageView.Image
}

Когда объект покидает этот блок, он автоматически удаляется.

В качестве альтернативы вы можете вызвать Dispose() в UIImage, когда вы знаете, что закончили его использовать.

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

Если вы удалите UIImage, который отображается в данный момент, ничего плохого не произойдет с UIImageView, поскольку он сохраняет свою собственную ссылку на изображение. Таким образом, удаляется только управляемый образ C#, но не обязательно образ Cocoatouch.

person Cheesebaron    schedule 07.10.2012
comment
В дополнение к вашему ответу я нашел это видео полезным для поиска нативных утечек, а также как этого раздела, в котором подробно рассказывается о том, что Dispose делает в MonoTouch. - person Dan Abramov; 08.10.2012