I'm working on an app, that's using an AVCaptureSession
, to show the "live" video stream from the device camera. I also use the AVCaptureVideoDataOutputSampleBufferDelegate
methods to capture still images (UIImage
) from the sampleBuffer to work with these images while the video is still being displayed on the screen (using OpenCV
). Anyway, there's a lot of code, much more than I could paste here, but that's actually not the point.
The app will show up a memory warning after some seconds and some more seconds later, crash silently. I tried to use Instruments to inspect leaks and memory allocation, but there's nothing suspicious showing up, no leaks at all and memory usage is never going above 5MB (overall and live bytes).
How do I find out why the memory warning is triggered?
EDIT: I tried to add some intentional leaks to the code, which will show up in Instruments, so it seems to work in theory...
I believe the problem you're having is related to the use of
UIImage
and Apple's behind the scenes buffering. I had a similar problem while using iOS's PDF functions. Since you didn't post any code, all I can specifically suggest is issuing release commands (ie.CGImageRelease()
,CGContextRelease()
etc..) and to always keep in mind the difference between a reference and the actual data.I just found the reason, although I don't understand why Instruments doesn't show this...
I used
[t performSelectorInBackground:sel withObject:[self imageFromSampleBuffer:sampleBuffer]];
in
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
method. After I commented that out, the app would run fine. So the problem here was, although I used a
NSLock
in the selector, the app would spawn more and more threads for each selector until the memory limit was reached. So the solution here is to use a lock before performing the selector, not inside the selector method.Thanks for all your help.