AVCaptureSession получает предупреждение о сбое памяти без причины - PullRequest
15 голосов
/ 10 марта 2012

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

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

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

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

Заранее спасибо!

Ответы [ 2 ]

23 голосов
/ 07 июля 2012

У меня были такие же разочарования. Я использовал 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 и убедиться, что у него нет входов или выходов, которые еще живы.

13 голосов
/ 11 декабря 2013

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

[self.vImagePreview.layer addSublayer:captureVideoPreviewLayer];

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

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

}

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

...