I am working on an app that manipulates HD photos. I am taking a photo with an AVCaptureSession, stopping it and then apply effects on that photo.
The thing that makes me CRAZY is that everything works fine, instruments tells me that I release all the memory I use properly and on time. It goes really high yes, sometimes to 100mb. But it goes down quickly.
Then I restart my Capture Session and I got a memory warning. There is absolutely no reason for that ;_; All the memory I used if freed... Then the next time I will restart the capture session the app crashes. No messages, no logs, nothing at all.
I don't know how to solve this, I don't know where to look for... If someone could help me a little bit I would be so glad!
Thanks in advance!
I've had the same frustrations. I was using ARC in a project where I was presenting a camera using AV Foundation. After presenting and popping the view controller a few times, my app would receive a low memory warning, and subsequently crash. Instruments didn't help much either. I discovered the solution by experimenting:
Even though you are using ARC in your camera class, you can implement the dealloc method (just don't call super
on dealloc).
- (void)dealloc {
AVCaptureInput* input = [session.inputs objectAtIndex:0];
[session removeInput:input];
AVCaptureVideoDataOutput* output = [session.outputs objectAtIndex:0];
[session removeOutput:output];
[session stopRunning];
}
This takes care of stopping the AVCaptureSession and ensuring it has no inputs or outputs still alive.
I have encounter the same problem I have found this line is the main problem
[self.vImagePreview.layer addSublayer:captureVideoPreviewLayer];
Just remove the previewlayer from the super layer while deallocating and there is no memory issue. My deallocating function is as follow
-(void)deallocSession
{
[captureVideoPreviewLayer removeFromSuperlayer];
for(AVCaptureInput *input1 in session.inputs) {
[session removeInput:input1];
}
for(AVCaptureOutput *output1 in session.outputs) {
[session removeOutput:output1];
}
[session stopRunning];
session=nil;
outputSettings=nil;
device=nil;
input=nil;
captureVideoPreviewLayer=nil;
stillImageOutput=nil;
self.vImagePreview=nil;
}
i called this function before popping and pushing any other view. It solved my issue.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With