2012-03-10 31 views
14

Tôi đang làm việc trên một ứng dụng xử lý ảnh HD. Tôi đang chụp ảnh với AVCaptureSession, dừng lại và sau đó áp dụng hiệu ứng trên ảnh đó.AVCaptureSession nhận cảnh báo và sự cố bộ nhớ mà không có lý do

Điều khiến tôi trở nên điên rồ là mọi thứ đều hoạt động tốt, các công cụ nói với tôi rằng tôi giải phóng tất cả bộ nhớ tôi sử dụng đúng và đúng giờ. Nó thực sự cao có, đôi khi đến 100mb. Nhưng nó đi xuống nhanh chóng.

Sau đó, tôi khởi động lại Phiên chụp và tôi nhận được cảnh báo bộ nhớ. Hoàn toàn không có lý do cho điều đó; _; Tất cả bộ nhớ tôi đã sử dụng nếu được giải phóng ... Sau đó, lần tiếp theo tôi sẽ khởi động lại phiên chụp mà ứng dụng gặp sự cố. Không có tin nhắn, không có nhật ký, không có gì cả.

Tôi không biết cách giải quyết vấn đề này, tôi không biết phải tìm ở đâu ... Nếu ai đó có thể giúp tôi một chút, tôi sẽ rất vui!

Cảm ơn trước!

+0

Một số mã sẽ giúp ích. –

Trả lời

22

Tôi đã có cùng một sự thất vọng. Tôi đã sử dụng ARC trong một dự án mà tôi đã giới thiệu một máy ảnh sử dụng AV Foundation. Sau khi trình bày và popping bộ điều khiển xem một vài lần, ứng dụng của tôi sẽ nhận được một cảnh báo bộ nhớ thấp, và sau đó sụp đổ. Dụng cụ cũng không giúp được gì nhiều. Tôi phát hiện ra giải pháp bằng cách thử nghiệm:

Mặc dù bạn đang sử dụng ARC trong lớp máy ảnh của mình, bạn có thể triển khai phương thức dealloc (chỉ cần không gọi super trên dealloc).

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

Điều này đảm bảo dừng AVCaptureSession và đảm bảo không có đầu vào hoặc đầu ra vẫn còn sống.

+2

@bryndodayle bạn đã cứu mạng tôi, cảm ơn bạn rất nhiều! –

+0

Tại sao đầu vào và đầu ra đầu tiên bị xóa? tại sao không loại bỏ tất cả đầu vào và đầu ra? –

13

Tôi có gặp phải cùng một vấn đề tôi đã tìm thấy dòng này là vấn đề chính

[self.vImagePreview.layer addSublayer:captureVideoPreviewLayer]; 

Chỉ cần loại bỏ các previewlayer từ lớp siêu trong khi deallocating và không có vấn đề bộ nhớ. Chức năng deallocating của tôi là như sau

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

} 

tôi gọi hàm này trước khi bật và đẩy bất kỳ chế độ xem nào khác. Nó giải quyết được vấn đề của tôi.

Các vấn đề liên quan