UIImage initWithCGImage приводит к проблеме с памятью в Obj-C - PullRequest
0 голосов
/ 12 января 2019

Я разрабатываю приложение, которое захватывает изображения с задней камеры 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, не приводит к проблеме с памятью.

Спасибо

1 Ответ

0 голосов
/ 21 января 2019

Как насчет @autoreleasepool? Это помогло мне несколько раз и в captureOutput, и в requestMediaDataWhenReady.

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...