Xcode 9中的CIContext内存泄漏问题在swift中

问题描述 投票:1回答:1

当使用CIContext.createCGImgage时,我在Xcode 9上出现内存泄漏问题。当从相机拍摄图像时需要更多内存然后应用程序崩溃

这是我的代码,

let ciContext = CIContext()
func callFillter() {        
    let coreImage = CIImage(image: self.appDelegate.selectPic)
    for i in 0..<CIFilterNames.count {
        itemCount = i
        if self.originalImage.image != nil{
             autoreleasepool() {
            print("originalimage\(self.originalImage)")
            self.imageToFilter.image = self.originalImage.image!               
            print("originalImage\(self.imageToFilter.image!)")
            print("coreImage\(coreImage)")
            let filter = CIFilter(name: "\(CIFilterNames[i])" )
            filter!.setDefaults()
            filter!.setValue(coreImage, forKey: kCIInputImageKey)
            let filteredImageData = filter!.value(forKey: kCIOutputImageKey) as! CIImage
            if let output = filter?.outputImage {
                ciContext.clearCaches()
                autoreleasepool(){
                let filteredImageRef = ciContext.createCGImage_(image: output, fromRect: filteredImageData.extent)
                var filterButton = UIButton(type: .custom)
                filterButton.frame = CGRect(x: self.xCoord, y: self.yCoord, width: self.buttonWidth, height: self.buttonHeight)
                filterButton.tag = self.itemCount
                filterButton.showsTouchWhenHighlighted = true
                filterButton.addTarget(self, action: #selector(self.filterButtonTapped(_:)), for: .touchUpInside)
                filterButton.layer.cornerRadius = 6                            
                filterButton.clipsToBounds = true                            
                let imageForButton = UIImage(cgImage: filteredImageRef)
                filterButton.setBackgroundImage(imageForButton, for: UIControlState())
                self.xCoord +=  self.buttonWidth + self.gapBetweenButtons
                self.filtersScrollView.addSubview(filterButton)

            }
        }
    }
    print("itemCount \(itemCount)")
    filtersScrollView.contentSize = CGSize(width: (buttonWidth + 5) * CGFloat(itemCount + 1), height: yCoord)

}

和从中调用的函数

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {

}

这需要大量的内存和应用程序崩溃。

ios arrays swift xcode9
1个回答
1
投票

发布作为答案,因为我看了你的代码并“得到”你想要做的事情。

您的代码有些问题 - 但主要的是您每次调用此函数时都会创建一个CIContext。将该上下文移出您的函数 - 使其更加全局化 - 您不仅会看到更好的内存使用情况,还会看到更好的性能。

其次,看起来您正在创建应用于单个图像的各种滤镜的滚动视图。基于此,为什么不摆脱autoreleasepool()ciContext.clearCaches()?这些并没有真正完成任何事情。

由于Swift(默认情况下)将只读参数传递给函数,为什么不将CIImage(或UIImage)添加为参数,以使代码更易于使用和调试?

最后,你在for i in 0..<CIFilterNames.count循环并在该循环中做了很多。拉出那个代码。使它成为一种功能。它可能有助于找出内存泄漏。

**同样,我敢打赌它为该循环中的每一次迭代创建一个CIContext是原因。将其移出并编写代码以使用单个上下文 - 不仅适用于该循环中的每次迭代,而且每次调用callFillter()

© www.soinside.com 2019 - 2024. All rights reserved.