2012-03-10 9 views
14

Pracuję nad aplikacją, która obsługuje zdjęcia w jakości HD. Robię zdjęcie z AVCaptureSession, zatrzymując je, a następnie stosuję efekty na tym zdjęciu.AVCaptureSession otrzymuje ostrzeżenie i awarię pamięci bez powodu

Coś, co sprawia, że ​​jestem SZALONY jest to, że wszystko działa dobrze, instrumenty mówią mi, że uwalniam całą pamięć, której używam właściwie i na czas. To idzie naprawdę wysoko, czasami do 100mb. Ale szybko spada.

Następnie restartuję sesję przechwytywania i otrzymuję ostrzeżenie o pamięci. Nie ma absolutnie żadnego powodu; _; Cała pamięć, której użyłem, jeśli została zwolniona ... Wtedy następnym razem, gdy uruchomię sesję przechwytywania, aplikacja się zawiesi. Brak wiadomości, brak dzienników, nic.

Nie wiem, jak to rozwiązać, nie wiem, gdzie szukać ... Jeśli ktoś mógłby mi trochę pomóc, byłbym bardzo zadowolony!

Z góry dzięki!

+0

Kod mógłby pomóc. –

Odpowiedz

22

Miałem te same frustracje. Używałem ARC w projekcie, w którym prezentowałem kamerę przy użyciu AV Foundation. Po kilkukrotnym przedstawieniu i wyświetleniu kontrolera widoku moja aplikacja otrzyma ostrzeżenie o małej ilości pamięci, a następnie ulegnie awarii. Instrumenty też nie pomogły. Odkryłem to rozwiązanie eksperymentując:

Nawet jeśli używasz ARC w swojej klasie kamer, możesz wdrożyć metodę dealloc (po prostu nie dzwoń na super na dealloc).

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

Zajmuje się zatrzymaniem AVCaptureSession i upewnieniem się, że nie ma jeszcze żadnych wejść ani wyjść.

+2

@bryndodayle uratowałeś mi życie, dziękuję bardzo! –

+0

Dlaczego właśnie pierwsze wejście i wyjście są usunięte? dlaczego nie usunąć wszystkich wejść i wyjść? –

13

mam spotkać ten sam problem znalazłem ten wiersz jest głównym problemem

[self.vImagePreview.layer addSublayer:captureVideoPreviewLayer]; 

prostu usunąć previewlayer z super warstwy podczas dealokując i nie istnieje problem pamięci. Moja funkcja dealokowania jest następująca: nazwałem tę funkcję przed pojawieniem się i naciśnięciem dowolnego innego widoku. To rozwiązało mój problem.

Powiązane problemy