2012-03-10 7 views
14

나는 HD 사진을 조작하는 응용 프로그램을 만들고 있습니다. AVCaptureSession을 사용하여 사진을 촬영하고 중지 한 다음 해당 사진에 효과를 적용합니다.AVCaptureSession은 아무 이유없이 메모리 경고 및 크래시를받습니다.

나를 괴롭히는 것은 모든 것이 잘 작동한다는 것이며, 악기는 내가 적절하게 사용하는 모든 메모리를 제 시간에 발표한다는 것을 알려줍니다. 그것은 정말로 높습니다. 예, 때로는 100MB에 이릅니다. 그러나 그것은 빨리 사라집니다.

그런 다음 캡처 세션을 다시 시작하면 메모리 경고가 표시됩니다. 그럴 이유가 전혀 없습니다; 내가 풀린 경우 사용한 모든 메모리 ... 다음에 캡처 세션을 다시 시작하면 응용 프로그램이 중단됩니다. 메시지가없고, 로그가없고, 전혀 없습니다.

나는 이것을 해결하는 방법을 모른다. 나는 어디에서 찾을 지 모른다 ... 누군가 나를 조금 도와 줄 수 있다면 나는 기뻐할 것이다!

미리 감사드립니다.

+0

일부 코드가 도움이 될 것입니다. –

답변

22

나는 동일한 좌절감을 겪었습니다. 저는 AV Foundation을 사용하는 카메라를 발표 할 프로젝트에서 ARC를 사용하고있었습니다. 프레젠테이션 및보기 컨트롤러를 몇 번 터진 후 내 응용 프로그램은 메모리 부족 경고를 받고 이후에 충돌합니다. 악기도별로 도움이되지 못했습니다.

카메라 클래스에서 ARC를 사용하더라도 dealloc 메서드를 구현할 수 있습니다 (dealloc에 ​​super을 호출하지 마십시오).

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

이것은 AVCaptureSession 정지하고 여전히 살아 입력 또는 출력이없는 있도록 처리한다. 내가이 줄을 발견 한 같은 문제가 발생할 수 있습니다

+2

@bryndodayle 당신이 내 목숨을 구 했어요. 고마워요! –

+0

첫 번째 입력과 출력 만 제거 된 이유는 무엇입니까? 왜 모든 입력과 출력을 제거하지 않습니까? –

13

는 할당 해제 및 더 메모리 문제가없는 상태

[self.vImagePreview.layer addSublayer:captureVideoPreviewLayer]; 

그냥 슈퍼 계층에서 previewlayer을 제거 주요 문제를입니다. 내가 터지는 및 기타보기를 밀어 전에이 함수를 호출

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

} 

따를 때 내 할당 해제 기능입니다. 그것은 내 문제를 해결했다.

관련 문제