У меня есть быстрая функция, которая принимает UIImage и возвращает CVPixelBuffer. При многократном запуске этой функции объем памяти продолжает увеличиваться, что приводит к сбою.
Что я уже понял:
- С помощью инструментов я изолировал проблему с памятью в строке кода image.draw. Он показывает много данных CGImage, хранящихся в памяти с течением времени.
- Я изолировал функцию, поэтому уверен, что проблема не в том, что происходит вне ее (в вызывающем), потому что я удалил оттуда весь код, а память продолжает расти.
- Я попытался отправить вызовы этому методу с некоторой задержкой, чтобы дать системе время на освобождение, но это не работает.
- Я попытался обернуть несколько частей кода в autoreleasepool, но все равно не работает.
- Я пробовал в основном потоке, в потоке утилиты.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
}