#ios #performance #uiimage
#iOS #Производительность #uiimage
Вопрос:
У меня есть экземпляр UIImage с изображением размером 200 КБ, затем я создаю 5 экземпляров UIImageView, которые ссылаются на тот же этот UIImage.
Интересно, сколько памяти выделено в этом случае — всего 200 КБ (для одного экземпляра UIImage) или 1 МБ (для 5 клонированных экземпляров UIImage)? В случае потери памяти, есть ли эффективный способ ее решения?
Ответ №1:
Пара мыслей:
UIImage
это ссылочный тип, поэтому, когда вы ссылаетесь на одно и то же изображение пять раз, у вас обычно будет один объект изображения в памяти. Это немного зависит от того, как вы это делаете. Например, если вы используетеUIImage(data:)
каждый раз или что-то в этом роде, каждый раз можно создавать экземпляр нового объекта, но если вы создаете экземпляр только одногоUIImage
, а затем продолжаете использовать его пять раз, вы не увидите, что происходит дублирующее потребление памяти.
В качестве отступления:
-
Вы говорите, что размер изображения составляет 200 КБ. Это размер исходного ресурса или вы выяснили, что именно столько памяти потребуется во время выполнения?
Причина, по которой я спрашиваю, заключается в том, что файлы JPG и PNG обычно сжимаются, но когда вы используете их в представлении изображения, они будут несжатыми. Объем памяти, который занимает изображение, имеет мало общего с размером файла исходного ресурса, а скорее соответствует размерам (в пикселях) изображения. Таким образом, для случайного PNG размером 676 КБ и разрешением 2560 x 1440 пикселей может потребоваться 14 МБ памяти (четыре байта на пиксель).
Обратите внимание, что это потребление памяти соответствует размеру рассматриваемого изображения, а не размерам представления изображения, к которому вы его добавили. Если вас беспокоит использование памяти и если размеры изображения превышают размер изображения (в разы больше масштаба устройства), то вы можете рассмотреть возможность изменения размера изображения.
-
В будущем вы сможете ответить на эти вопросы эмпирически, используя инструменты. Например, на следующей временной шкале на зеленом указателе я загрузил файл a
UIImage
с ресурсом 676 КБ со скромным объемом памяти, я настроил вид изображенияimage
на использование этого ресурса на фиолетовом указателе со значительным объемом памяти, поскольку он распаковал это изображение размером 2560 x 1440 пикселей, и я загрузил еще пять видов изображенийс тем же изображением на оранжевом указателе с незначительным дальнейшим воздействием на память.