如何解决图像处理中的内存问题?

时间:2019-04-09 20:04:27

标签: swift image memory-leaks gif

我正在创建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帧)进行了测试,效果很好,但是实际上我需要使用所有大小的图片,所以我不知道问题出在哪里?

任何帮助都可以接受。

1 个答案:

答案 0 :(得分:2)

这是您的主要问题之一的来源:

var frameList = [UIImage]() 

警钟!在内存中保存UIImages数组是一种用尽内存的好方法。将图像保存到磁盘,并排列其名称或URL。