2013-08-20 2 views
1

Я наблюдаю взрыв памяти 25MB на [self setImageData:[AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer]];Предупреждения о памяти при использовании AVCaptureStillImageOutput

Ниже фрагмент кода захват изображения и обеспечение формата JPG данных. Когда мы делаем больше снимков, система сообщает о низком предупреждении памяти.

В профилировщике мы не видим утечек, но иногда приложение сообщает о низком уровне памяти даже при 20 МБ и сбоях приложений.

[[self stillImageOutput] captureStillImageAsynchronouslyFromConnection:videoConnection 
             completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) 
{ 
    [[self captureSession] stopRunning]; 
    if (imageSampleBuffer != NULL) 
    { 
     CFDictionaryRef exifAttachments = CMGetAttachment(imageSampleBuffer, kCGImagePropertyExifDictionary, NULL); 
     if (exifAttachments) 
     { 
      NSLog(@"attachements: %@", exifAttachments); 
     } 


     [self setImageData:[AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer]]; 
    } 
    imageSampleBuffer = nil; 

    // call the designated delegate 
    [self.aCDMCameraCaptureNotificationDelegate imageDidSuccessfullyCaptured]; 
}]; 
+0

вы не сможете уменьшить объем памяти, который использует эта часть кода, если вы не уменьшите разрешение захваченного изображения. Вы должны сделать свое приложение готовым для обработки предупреждений о низкой памяти без сбоев. –

+0

После профилирования я вижу следующие утечки памяти. –

ответ

0

Изображения, в зависимости от их разрешения, могут занимать немного места в вашей памяти. Вы должны убедиться, что изображения, которые вы производите, не завешивают все. Существует библиотека кэширования веб-изображений под названием SDWebImage, которая может хранить ваше изображение в хранилище значений ключа в памяти и на диске, поэтому, если давление в памяти увеличивается слишком сильно, оно может очищать кеш памяти в памяти и когда вам нужно восстановить изображения, которые вы можете вызвать это с диска.

Если вы показываете изображения на экране, одно изображение из снимка прекрасное, но если вы показываете несколько изображений, попробуйте изменить размер изображений до их соответствующих размеров изображения и сохранить как оригинал в кеше.

0

После профилирования я вижу следующие утечки памяти.

# Address Category Event Type RefCt Timestamp Size Responsible Library Responsible Caller 
0 0x2087cb80 __NSDate Malloc 1 00:18.446.047 16 AVFoundation -[AVCaptureSession _stopPreviewing] 
1 0x2087cb80 __NSDate Autorelease  00:18.446.056 0 AVFoundation -[AVCaptureSession _stopPreviewing] 
2 0x2087cb80 __NSDate Release 0 00:28.472.781 0 Foundation -[NSAutoreleasePool drain] 
3 0x2087cb80 __NSDate Free 0 00:28.472.787 -16 Foundation -[NSAutoreleasePool drain] 
4 0x2087cb80 Malloc 16 Bytes Malloc 1 00:42.834.501 16 libdispatch.dylib _dispatch_call_block_and_release 

Можете ли вы указать, какое утверждение вызывает утечку памяти?

+0

Просьба указать, что после отправки плохо отображается. –

Смежные вопросы