我正在创建gif拆分器,该拆分器从给定的gif文件返回图像序列,它适用于小尺寸gif,一切看起来都很理想,但与大文件(大于500×500 px)有关,会导致内存问题。
Xcode消息:来自调试器的消息:由于内存问题而终止 “连接中断”通讯错误
比这个问题还大,我看不到XCode分析器中的任何泄漏或负载,内存使用情况显示50-110 mb之间?!
我尝试更改gifOptions
,但没有任何改变。
import UIKit
import ImageIO
import MobileCoreServices
class CGifManager {
static let shared = CGifManager()
public func getSequence(gifNamed: String) -> [UIImage]? {
guard let bundleURL = Bundle.main .url(forResource: gifNamed, withExtension: "gif") else {
print("This image named \"\(gifNamed)\" does not exist!"); return nil
}
guard let imageData = try? Data(contentsOf: bundleURL) else {
print("Cannot turn image named \"\(gifNamed)\" into NSData") return nil
}
let gifOptions = [ kCGImageSourceShouldAllowFloat as String : true as NSNumber,
kCGImageSourceCreateThumbnailWithTransform as String : true as NSNumber,
kCGImageSourceCreateThumbnailFromImageAlways as String : true as NSNumber
] as CFDictionary
guard let imageSource = CGImageSourceCreateWithData(imageData as CFData, gifOptions) else {
debugPrint("Cannot create image source with data!"); return nil
}
let framesCount = CGImageSourceGetCount(imageSource)
var frameList = [UIImage]()
for index in 0 ..< framesCount {
if let cgImageRef = CGImageSourceCreateImageAtIndex(imageSource, index, nil) {
let uiImageRef = UIImage(cgImage: cgImageRef)
frameList.append(uiImageRef)
}
}
return frameList
}
}
此代码使用gif大小为400 x 400和400 x 500(30帧)进行了测试,效果很好,但是实际上我需要使用所有大小的图片,所以我不知道问题出在哪里?
任何帮助都可以接受。
答案 0 :(得分:2)
这是您的主要问题之一的来源:
var frameList = [UIImage]()
警钟!在内存中保存UIImages数组是一种用尽内存的好方法。将图像保存到磁盘,并排列其名称或URL。