AVCaptureSession получает предупреждение о сбоях и авариях без причины

Я работаю над приложением, которое управляет HD-фотографиями. Я снимаю фотографию с помощью AVCaptureSession, останавливая ее, а затем применяю эффекты к этой фотографии.

Вещь, которая делает меня CRAZY, заключается в том, что все работает нормально, инструменты говорят мне, что я освобождаю всю память, которую я использую правильно и вовремя. Он действительно высок, да, иногда до 100 мб. Но он быстро падает.

Затем я перезапускаю сеанс Capture и получил предупреждение о памяти. Для этого нет никаких оснований; Вся память, которую я использовал, если была освобождена... Тогда в следующий раз, когда я перезапущу сеанс захвата, приложение выйдет из строя. Нет сообщений, никаких журналов, ничего.

Я не знаю, как это решить, я не знаю, где искать... Если бы кто-то мог мне помочь, я был бы так рад!

Спасибо заранее!

Ответ 1

У меня были такие же разочарования. Я использовал ARC в проекте, где я представлял камеру с использованием AV Foundation. Несколько раз представляя и выскакивая контроллер вида, мое приложение получит предупреждение о низком уровне памяти и впоследствии выйдет из строя. Инструменты тоже не помогли. Я обнаружил решение, экспериментируя:

Даже если вы используете ARC в своем классе камеры, вы можете реализовать метод dealloc (просто не вызывайте super на dealloc).

- (void)dealloc {
    AVCaptureInput* input = [session.inputs objectAtIndex:0];
    [session removeInput:input];
    AVCaptureVideoDataOutput* output = [session.outputs objectAtIndex:0];
    [session removeOutput:output];  
    [session stopRunning];
}

Это поможет остановить AVCaptureSession и гарантировать, что у него нет входов или выходов.

Ответ 2

Я столкнулся с той же проблемой, я обнаружил, что эта строка является основной проблемой

[self.vImagePreview.layer addSublayer:captureVideoPreviewLayer];

Просто удалите предварительный слой из суперслоя при освобождении памяти и проблемы с памятью. Моя функция deallocating следующая:

 -(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;

}

Я вызывал эту функцию перед тем, как выскочить и нажать любое другое представление. Он решил мою проблему.