将CIImage转换为主队列中的CGImage时泄漏

时间:2015-11-17 13:18:07

标签: ios swift memory-leaks

我在Xcode 7.1 iOS 9.1(swift)中创建了一个简单的应用程序。该应用程序从相机获取CMSampleBuffer,将其转换为CGImage并将其分配给UIImageView。当应用程序将CIImage转换为相机队列中的CGImage时,该应用程序运行良好。但是当应用程序在主队列中转换它时,应用程序就会泄漏。

这是泄露的版本:

func captureOutput(captureOutput: AVCaptureOutput!,didOutputSampleBuffer sampleBuffer: CMSampleBuffer!,fromConnection connection: AVCaptureConnection!) {

    let buffer = CMSampleBufferGetImageBuffer(sampleBuffer)!
    let ciimg = CIImage(CVPixelBuffer: buffer)
//  let cgimg = ViewController.cicontext.createCGImage(ciimg, fromRect: ciimg.extent)

    dispatch_sync(dispatch_get_main_queue(), {
        let cgimg = ViewController.cicontext.createCGImage(ciimg, fromRect: ciimg.extent)

        self.imageView.image = UIImage(CGImage: cgimg)
    })
}

如果我评论"让cgimg"在dispatch_sync内部并取消注释它,应用程序不会泄漏。但对于我的应用程序,我需要在主队列中转换它。

似乎问题与dispatch_sync块内的引用计数有关。

有人可以解释泄漏吗?

此致 瓦列。

2 个答案:

答案 0 :(得分:1)

如果你想访问阻止内部的cgimg那么你应该让它变弱。

弱让cgimg = ViewController.cicontext.createCGImage(ciimg,fromRect:ciimg.extent)

答案 1 :(得分:0)

您无法在sync操作中引用强对象。试试这个;

func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!,fromConnection connection: AVCaptureConnection!) {

        let buffer = CMSampleBufferGetImageBuffer(sampleBuffer)!
        let ciimg = CIImage(CVPixelBuffer: buffer)
        weak let cgimg = ViewController.cicontext.createCGImage(ciimg, fromRect: ciimg.extent)

        dispatch_sync(dispatch_get_main_queue(), {
            self.imageView.image = UIImage(CGImage: cgimg)
        })
    }