2012-03-10 6 views
14

मैं ऐसे ऐप पर काम कर रहा हूं जो एचडी फोटो में हेरफेर करता है। मैं एक AVCaptureSession के साथ एक फोटो ले रहा हूं, इसे रोक रहा हूं और फिर उस तस्वीर पर प्रभाव लागू करता हूं।AVCaptureSession किसी भी कारण से स्मृति चेतावनी और क्रैश प्राप्त करें

चीज जो मुझे क्रैजी बनाती है वह यह है कि सब ठीक काम करता है, यंत्र मुझे बताता है कि मैं ठीक से और समय पर उपयोग की जाने वाली सभी मेमोरी को छोड़ देता हूं। यह वास्तव में उच्च हां, कभी-कभी 100 एमबी तक जाता है। लेकिन यह जल्दी से नीचे चला जाता है।

फिर मैंने अपना कैप्चर सत्र पुनरारंभ किया और मुझे स्मृति चेतावनी मिली। इसके लिए बिल्कुल कोई कारण नहीं है; _; अगर मैं मुक्त हो जाता हूं तो सभी मेमोरी ... फिर अगली बार मैं कैप्चर सत्र को पुनरारंभ करूंगा ऐप क्रैश हो जाएगा। कोई संदेश नहीं, कोई लॉग नहीं, बिल्कुल कुछ भी नहीं।

मुझे नहीं पता कि इसे कैसे हल किया जाए, मुझे नहीं पता कि कहां देखना है ... अगर कोई मुझे थोड़ा सा मदद कर सकता है तो मैं बहुत खुश हूं!

अग्रिम धन्यवाद!

+0

कुछ कोड मदद करेंगे। –

उत्तर

22

मुझे वही निराशा हुई है। मैं एक परियोजना में एआरसी का उपयोग कर रहा था जहां मैं एवी फाउंडेशन का उपयोग कर कैमरा पेश कर रहा था। दृश्य नियंत्रक को प्रस्तुत करने और पॉप करने के बाद कुछ बार, मेरे ऐप को कम स्मृति चेतावनी मिलेगी, और बाद में क्रैश हो जाएगी। उपकरण बहुत मदद नहीं करते थे। मैंने प्रयोग करके समाधान की खोज की:

भले ही आप अपने कैमरे के वर्ग में एआरसी का उपयोग कर रहे हों, आप डेलोक विधि को कार्यान्वित कर सकते हैं (केवल 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

@ ब्रेंडोडायले आपने अपना जीवन बचाया, बहुत बहुत धन्यवाद! –

+0

क्यों पहले इनपुट और आउटपुट हटा दिए जाते हैं? सभी इनपुट और आउटपुट क्यों नहीं हटाते? –

13

मैं एक ही समस्या मैं इस लाइन पाया है मुठभेड़ है मुख्य समस्या

[self.vImagePreview.layer addSublayer:captureVideoPreviewLayer]; 

बस सुपर परत से previewlayer को दूर करते हुए deallocating और कोई स्मृति मुद्दा है। मेरे 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; 

} 

मैं पॉपिंग और किसी अन्य दृश्य धक्का से पहले इस समारोह कहा जाता है। यह मेरी समस्या हल हो गया।

संबंधित मुद्दे