我在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块内的引用计数有关。
有人可以解释泄漏吗?
此致 瓦列。
答案 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)
})
}