Я разрабатываю приложение, которое захватывает изображения с задней камеры iPhone. Эти изображения затем обрабатываются асинхронно.
Поэтому я использую AVFoundation функции в Obj-C . Моя проблема в том, что мое приложение падает из-за проблем с памятью при захвате изображений.
Вот код, который я использую в обратном вызове captureOutput :
- (void)captureOutput:(AVCaptureOutput *)output didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
connection.videoOrientation = AVCaptureVideoOrientationLandscapeLeft;
CVPixelBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CIImage* ciimage = [[CIImage alloc] initWithCVPixelBuffer:imageBuffer];
CIContext* context = [CIContext contextWithOptions:nil];
CGImage* cgImage = [context createCGImage:ciimage fromRect:[ciimage extent]];
@synchronized(self) {
UIImage* image = [[UIImage alloc] initWithCGImage:cgImage];
self.uiimageBuffer = image;
}
CGImageRelease(cgImage);
}
Поскольку мне нужно асинхронно обрабатывать изображение, захваченное в другом месте приложения, я ввел буфер с именем uiimageBuffer . Этот буфер обновляется каждый раз, когда вызывается captureOutput, как написано ниже:
UIImage* image = [[UIImage alloc] initWithCGImage:cgImage];
self.uiimageBuffer = image;
Но выделение UIImage приводит к проблеме с памятью очень и очень быстро (несколько секунд).
Итак мой вопрос : как я могу обновлять свой буфер без выделения нового UIImage при каждом вызове captureOutput?
PS : тот же фрагмент кода, написанный на Swift 4, не приводит к проблеме с памятью.
Спасибо