2010-04-14 15 views
5

में लोड होने वाले लीकी नल को कैसे ढूंढें मैं लीक्स के साथ गड़बड़ कर रहा हूं कि यह पता लगाने की कोशिश कर रहा है कि कौन सा फ़ंक्शन अस्वीकृत नहीं किया जा रहा है (मैं अभी भी इसके लिए नया हूं) और वास्तव में कुछ अनुभवी अंतर्दृष्टि का उपयोग कर सकता हूं।मॉलोक 32kb

मेरे पास यह कोड है जो अपराधी प्रतीत होता है। हर बार जब मैं इस कोड को कॉल करने वाला बटन दबाता हूं, तो 32kb स्मृति को अतिरिक्त रूप से स्मृति में आवंटित किया जाता है और जब बटन जारी किया जाता है तो स्मृति को हटाया नहीं जाता है।

मैं क्या पाया गया कि हर कि AVAudioPlayer M4A फ़ाइल खेलने के लिए कहा जाता है था, m4a फ़ाइल को पार्स करने अंतिम समारोह MP4BoxParser::Initialize() है और इस बदले में Cached_DataSource::ReadBytes

मेरा प्रश्न है, कैसे करना है के माध्यम से स्मृति के 32 केबी आवंटित मैं इस बात को खत्म करने के बारे में सोचता हूं कि यह समाप्त हो जाने के बाद यह बटन दबाए जाने पर हर बार 32 केबी आवंटित नहीं करता है?

कोई भी सहायता जो आप प्रदान कर सकते हैं उसकी बहुत सराहना की जाती है!

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

//stop playing 
theAudio.stop; 


// cancel any pending handleSingleTap messages 
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(handleSingleTap) object:nil]; 

UITouch* touch = [[event allTouches] anyObject]; 


NSString* filename = [g_AppsList objectAtIndex: [touch view].tag]; 

NSString *path = [[NSBundle mainBundle] pathForResource: filename ofType:@"m4a"]; 
theAudio=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; 
theAudio.delegate = self; 
[theAudio prepareToPlay]; 
[theAudio setNumberOfLoops:-1]; 
[theAudio setVolume: g_Volume]; 
[theAudio play]; 
} 

उत्तर

2

कोको में चाल स्मृति प्रबंधन के लिए release को बाद में एक कॉल के साथ alloc, retain या copy के लिए किसी भी कॉल बाहर संतुलन के लिए है।

इस मामले में, आप अपने theAudio चर को प्रारंभ करने के लिए alloc भेज रहे हैं, लेकिन आप कभी भी release भेज रहे हैं।

मान लीजिए कि आपके पास एक समय में केवल एक ध्वनि बजाना होगा, ऐसा करने का सबसे अच्छा तरीका आपके नियंत्रक की संपत्ति के साथ है (जिसकी यह -touchesBegan विधि है)। संपत्ति घोषणा इस प्रकार दिखाई देगा:

theAudio = nil; // note: simple assignment is preferable in init 

और अपने dealloc विधि में चर जारी करने के लिए सुनिश्चित हो:

@property (nonatomic, retain) AVAudioPlayer * theAudio; 

तब आप अपने init विधि में nil को theAudio सेट करना होगा

[theAudio release]; 

अब, आपके touchesBegan इस तरह दिख सकते हैं:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    //stop playing 
    theAudio.stop; 
    ... 
    AVAudioPlayer * newAudio = [[AVAudioPlayer alloc] initWithContentsOfUrl:...]; 
    self.theAudio = newAudio; // it is automatically retained here... 

    theAudio.delegate = self; 
    [theAudio prepareToPlay]; 
    [theAudio setNumberOfLoops:-1]; 
    [theAudio setVolume: g_Volume]; 
    [theAudio play]; 

    [newAudio release];  // ...so you can safely release it here 
} 
+0

क्या आप समझा सकते हैं कि आप किस 'init' विधि का जिक्र कर रहे हैं? (दोबारा, खेद है कि मैं इस पर बहुत नया हूं) – iwasrobbed

+0

और यह भी सत्यापित करने के लिए कि मैं इसे समझता हूं: आप जो कह रहे हैं वह है कि मुझे ऑडियो को अतिरिक्त आवंटित चर में लोड करने की आवश्यकता है ताकि मैं वर्तमान को रद्द करने की कोशिश नहीं कर रहा हूं m4a फ़ाइल (या अंत में स्मृति का एक विलुप्त टुकड़ा कॉल करें) मुझे लगता है कि मेरा प्रश्न है, क्या 'ऑडियो' अभी भी अतिरिक्त स्मृति आवंटित करेगा क्योंकि इसे 'dealloc()' कहा जाता है जब तक इसे डेलोकेट नहीं किया जाता है? – iwasrobbed

+0

आम तौर पर बोलते हुए, प्रत्येक नियंत्रक में '-init' और' dealloc' विधि दोनों होती है। क्या मैं इसे 'UIViewController' के रूप में मान सकता हूं? यदि ऐसा है, तो ओवरराइड करने के लिए उचित तरीका है -इनिटविथनिबनाम: बंडल: दूसरा विकल्प है कि आप अपने ivar को 'viewDidLoad' विधि में शून्य पर सेट करें। –

1

यह पंक्ति मेरे लिए अपराधी दिखता है:

theAudio=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; 

जब इस संसाधन जारी किया जाता है?

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