【发布时间】:2017-10-26 19:59:59
【问题描述】:
我有一个 swift 函数,它接受一个 UIImage 并返回一个 CVPixelBuffer。多次运行此函数时,内存不断增长,导致崩溃。
我已经想通了:
- 我使用仪器隔离了 image.draw 代码行中的内存问题。它显示了一段时间内保存在内存中的大量 CGImage 数据。
- 我隔离了函数,所以我确信问题不在于它之外(在调用者中)发生的事情,因为我从那里删除了所有代码并且内存不断增长。
- 我尝试将调用分派给此方法,但有一些延迟,以便让系统有时间解除分配,但它不起作用
- 我尝试在 autoreleasepool 中封装多个部分代码,但仍然无法正常工作。
- 我尝试了主线程、utility.qos 线程等,没有任何变化
- 我阅读了有关 StackOverflow 的所有其他问题,但似乎其他人的解决方案不适用于我的情况。
这是我的代码。感谢您提供任何帮助,因为我真的很想解决这个问题。
fileprivate func CreatePixelBufferFromImage(_ image: UIImage) -> CVPixelBuffer?{
let size = image.size;
var pxbuffer : CVPixelBuffer?
let status = CVPixelBufferPoolCreatePixelBuffer(kCFAllocatorDefault, self.exportingAdaptor!.pixelBufferPool!, &pxbuffer)
guard (status == kCVReturnSuccess) else{
return nil
}
CVPixelBufferLockBaseAddress(pxbuffer!, CVPixelBufferLockFlags(rawValue: 0));
let pxdata = CVPixelBufferGetBaseAddress(pxbuffer!);
let rgbColorSpace = CGColorSpaceCreateDeviceRGB();
let context = CGContext(data: pxdata, width: Int(size.width),
height: Int(size.height), bitsPerComponent: 8, bytesPerRow: CVPixelBufferGetBytesPerRow(pxbuffer!), space: rgbColorSpace,
bitmapInfo: CGImageAlphaInfo.premultipliedFirst.rawValue);
context?.translateBy(x: 0, y: image.size.height);
context?.scaleBy(x: 1.0, y: -1.0);
UIGraphicsPushContext(context!)
image.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height));
//
UIGraphicsPopContext()
CVPixelBufferUnlockBaseAddress(pxbuffer!, CVPixelBufferLockFlags(rawValue: 0));
return pxbuffer
}
【问题讨论】:
-
你能发布独立代码吗?例如
exportingAdaptor是什么?
标签: ios swift memory-management uiimage cvpixelbuffer