使用AVCaptureStillImageOutput时内存不足警告

时间:2013-08-20 07:17:22

标签: iphone memory-management avcapturesession

我在[self setImageData:[AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer]];

观察到25MB的内存突发

以下代码片段捕获图片并提供jpg格式的数据。当我们拍摄更多照片时,系统会报告低内存警告。

在分析器中我们看不到泄漏,但有时候应用程序报告即使在20MB且应用程序崩溃时内存警告也很低。

[[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];
 }];

2 个答案:

答案 0 :(得分:0)

根据图像的分辨率,图像可能占用内存中的一些空间。您需要确保您生成的图像不会占用一切。有一个名为SDWebImage的Web图像缓存库,它可以将您的图像存储在内存和磁盘上的键值存储中,因此如果内存压力增加太多,它可以刷新内存中的图像缓存,当您需要恢复图像时,可以调用它来自磁盘。

如果您在屏幕上显示图像,则捕获中的一个图像很好,但如果您要显示多个图像,请考虑将图像调整为相应的imageView大小,并将原始图像存储在缓存中。

答案 1 :(得分: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

您能指出导致此内存泄漏的语句吗?