Немедленно освобождает память, занятую предыдущим изображением.Имя?
Не сразу, но она должна быть намного быстрее, чем ожидание сборщика мусора.
Вызов Dispose
понизит удалось ссылку на роднойUIImage
. Если ничто иное (изначально) не имеет ссылки на UIImage
(RetainCount == 0), тогда оно будет освобождено (подсчет ссылок ObjC).
В коде imageView
еще не имеет ссылку на него, пока его свойство Image
устанавливается в newImage
- именно поэтому я ответил не сразу.
Если да, то есть ли более чистое решение?
Не совсем. Предоставление GC делает работу более чистым - но изображение может быть очень большим и стоит освобождать как можно скорее.
Также не стоит (и в любом случае не будет чище), добавив локальную переменную, чтобы удостовериться (если никакой другой основной ссылки не существует), изображение будет немедленно освобождено - это произойдет на следующей строке.
Имеет ли это какое-либо отношение к NSAutoreleasePool?
Ничего? хорошо, что это связано с памятью в обоих случаях.
Создание изображений будет использовать (кеш) текущий NSAutoreleasePool
и, в конце концов, будет истощен. Если вы обрабатываете много вещей (например, цикл), то часто стоит иметь свой собственный, недолговечный пул, чтобы обеспечить более быстрый слив.
Некоторые API (хорошо знают, чтобы потребовать много памяти) украшены атрибутом, который автоматически добавит (btouch) NSAutoreleasePool
- но нелегко узнать, какой из них.
В сомневаюсь, что вы лучше использовать Apple инструменты для измерения ...
Спасибо за быстрый ответ, это более или менее то, что я ожидал. Что касается 'NSAutoreleasePool', я надеялся, что, возможно, если я перенесу назначение в выделенный пул, мне не нужно было бы писать это условие' if'. Наверное, это не так?Боюсь, я не понимаю, как «NSAutoreleasePool» следует использовать в MonoTouch, что такое дренирование и как он играет с GC Mono. –
'NSAutoreleasePool' подобен ObjC (документация Apple применяется), и ** ** ** напрямую не связана с GC (которая охватывает только управляемые ссылки), так как это ** родная ** ссылка будет храниться в пуле. Это также означает, что он не * решает *, используя 'if' и вызывающий' Dispose'. См. Ответ Рольфа http://stackoverflow.com/a/10440506/220643 для примера, где он * был * необходим, но любой ранее существовавший 'UIImage', назначенный' UIImageView.Image', не будет удален (в этом пример), пока GC не обработает его (поэтому было бы лучше называть 'Dispose' на нем, если не null, как ваш собственный пример). – poupou