Можно ли лучше управлять памятью в моем коде при использовании UIImageView.animationImages и startAnimating ()? - PullRequest
0 голосов
/ 03 июня 2018

Я объявляю некоторые массивы UIImage:

var animationImages1: [UIImage] = []
var animationImages2: [UIImage] = []

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

DispatchQueue.global(qos: .background).async { () -> Void in

self.animationImages1 = self.createImageArray(total: 57, imagePrefix: "animation1")
self.animationImages2 = self.createImageArray(total: 42, imagePrefix: "animation2")

}

Вызванная выше функция:

var imageArray: [UIImage] = []

for imageCount in 1..<total {
     var imageName = String(format: "\(imagePrefix)\(imageCount)")

     let image = UIImage(contentsOfFile: Bundle.main.path(forResource: imageName, ofType: "png")!)!
     //let image = UIImage(named: imageName)!

     imageArray.append(image)
}

return imageArray

Затем, когда я хочу анимировать, я вызываю эту функцию:

func animate(imageView: UIImageView, images: [UIImage], duration: TimeInterval) {
     imageView.animationImages = images
     imageView.animationDuration = duration
     imageView.animationRepeatCount = 1
     imageView.startAnimating()
}

Я пытался сделать оба theImageView.stopAnimating() и theImageView.animationImages = nil перед повторным вызовом анимации, но не заметил никакихулучшение управления памятью с использованием любого из них.

С UIImage (named :) изображения, видимые в приложении, начинают исчезать частично или полностью, когда память заканчивается.С помощью UIImage (contentsOfFile :) приложение быстро падает, как только память заканчивается.

Примечание: я попробовал UIImage (named :) с изображениями в каталоге Assets, а затем переключился на UIImage (contentsOfFile :) с помощьюизображения, перетаскиваемые в проект за пределами Assets.xcassets

Возможно ли использовать эту функцию UIImageView для более длинных анимаций (2-5 секунд: 40-150 pngs) с размером файла около 450 Кб каждый илиЭто слишком много памяти, независимо от того, как вы это делаете?

В настоящее время он работает без проблем на новом iPad Pro, и с помощью симулятора XCode он работает хорошо (но съедает много памяти) на всехразмеры устройства.На iPhone X и iPhone 8 Plus у него заканчивается память довольно рано - после воспроизведения от 5 до 10 анимаций или около того.

Я что-то упустил, это невозможно, или мне нужноПровести дальнейшие исследования способов контроля памяти при запуске этих больших массивов UIImage с помощью startAnimating ()?

Использование памяти не снижается.Я, должно быть, куда-то кеширую ...

Спасибо за любую помощь!

1 Ответ

0 голосов
/ 04 июня 2018

Я создал новый проект XCode, упрощенный, чтобы сосредоточиться только на этой проблеме, и получил @ 1001 * правильный ответ от @Stephan Schlecht здесь .

Хотя сбой памяти не происходит, когдаприсваивание изображений массиву, и попадание в память происходит только после воспроизведения анимации, и все же единственный способ восстановить память, по-видимому, - удалить все ссылки на массив изображений, задав для переменной URImageView и переменную array, и свойство animationImages.в пустой массив.

Итак, в конкретном примере, приведенном в этом вопросе:

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