Swift 4 правильно снять маску - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть прокрутка, содержащая несколько UIImageViews, которые хранятся в массиве.Каждый из этих UIImageViews имеет одинаковое фоновое изображение, но уникальную маску.Когда эти изображения не отображаются на экране, я хочу удалить маску для экономии памяти.Функция, подобная следующей, вызывается, когда маска должна быть создана или удалена.В этом случае, однако, объем памяти будет не уменьшаться, когда маска imageView установлена ​​в ноль.

func updateView(imageName: String, imageView: UIImageView, show: Bool)
    if show {
       let newMask = UIImageView()
       newMask.image = UIImage(named: imageName)
       newMask.frame = frame
       imageView.mask = newMask
    } else {
       imageView.mask = nil
    }
 }

Как решить эту проблему?Как новичок я искал ответ в течение нескольких дней, и любая помощь будет очень признательна.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Самый большой объект в вашем коде - это UIImage, который вы используете как image UIImageView, который вы используете в качестве маски.(Сам UIImageView ничтожно мал.) UIImages загружаются, говоря, что UIImage(named:) являются кэшированными ;следовательно, удаление UIImageView не приводит к уменьшению памяти.Но хорошая новость заключается в том, что в следующий раз, когда вы сделаете это, изображение уже будет кэшировано, поэтому память также не увеличится.

Обратите внимание, что если UIImage велико, его память будет большой, даже есливы отображаете его маленьким (т. е. если вы заставляете UIImageView выполнять работу по уменьшению размера UIImage до его собственного размера).Это огромная трата памяти.Существуют стандартные методы загрузки или перерисовки изображения UIImage с фактическим размером, необходимым для отображения, что может значительно сэкономить память.

0 голосов
/ 04 декабря 2018

Обратите внимание, что в документации для UIImage (named:) указано, что он кэширует загружаемые изображения.Таким образом, если вы не получаете предупреждение о памяти, отключение изображения не приведет к снижению потребления памяти;изображение все еще в кеше.Используйте одну из других инициализаций, которые не кэшируются, например init (data :) или init (contentsOfFile :), если вы действительно не хотите кэшировать.

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