12

से ध्वनि लीक प्रीलोडेड है मेरे पास एक AVAudioPlayer उदाहरण है जो audioPlayer.prepareToPlay() के साथ मेमोरी में ध्वनि लोड करता है, और उसके बाद कुछ इसे शुरू करने के बाद। मुझे एक समस्या है कि पृष्ठभूमि में प्रवेश करने के लगभग दस मिनट बाद, यह स्मृति से लीक हो जाती है और मुझे तैयार नहीं किया जा रहा है। उस घंटों के बाद, मेरे पास prepareToPlay() फिर से चलाने की क्षमता नहीं है। लंबी अवधि के लिए स्मृति में उस प्रीलोडेड ध्वनि को कैसे छोड़ें? मैं applicationDidFinishLaunchingWithOptions विधि में खेलने के लिए ध्वनि तैयारी कर रहा हूँ:AVAudioPlayer स्मृति

let dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 
    dispatch_async(dispatchQueue, {[weak self] in 
     var audioSessionError: NSError? 

     let audioSession = AVAudioSession.sharedInstance() 
     NSNotificationCenter.defaultCenter().addObserver(self!, selector: "handleInterruption:", name: AVAudioSessionInterruptionNotification, object: nil) 
     audioSession.setActive(true, error: nil) 

     if (audioSession.setCategory(AVAudioSessionCategoryPlayback, error: &audioSessionError)) { 
      println("Successfully set the audio session") 
     } else { 
      println("Could not set the audio session") 
     } 

     let filePath = NSBundle.mainBundle().pathForResource("sound", ofType:"mp3") 
     let fileData = NSData(contentsOfFile: filePath!, options: .DataReadingMappedIfSafe, error: nil) 
     var error:NSError? 

     self!.audioPlayer = AVAudioPlayer(data: fileData, error: &error) 

     self!.audioPlayer?.numberOfLoops = -1 

     self!.audioPlayer?.delegate = self 

     if (self?.audioPlayer?.prepareToPlay() != false) { 
      println("Successfully prepared for playing") 
     } else { 
      println("Failed to prepare for playing") 
     } 
    }) 

फिर didReceiveRemoteNotification में मैं पृष्ठभूमि में खेलने के लिए कोशिश कर रहा हूँ: self.audioPlayer?.play(), यह रिटर्न true। शायद यह काम करता है, लेकिन लगभग 10-20 मिनट के बाद यह काम नहीं करता है। और ध्यान दें कि .play() अब false देता है।

  1. वहाँ एक रिलीज करने के लिए एआरसी (स्वचालित संदर्भ गिनती) निष्क्रिय करने के लिए और भावना dealloc audioPlayer मैन्युअल है?

  2. शायद मुझे निम्न स्तर के एपीआई जैसे OpenAL का उपयोग करने की आवश्यकता है? हालांकि मैं इसका उपयोग नहीं करूंगा क्योंकि इसे आईओएस 9 में बहिष्कृत किया गया है और बाद में मुझे OpenAL के बिना इसे फिर से लिखना होगा।

  3. कोई और विचार? शायद मुझे Audio UnitsRemoteIO के साथ उपयोग करने की आवश्यकता है? यदि यह काम करेगा, तो कृपया कुछ उदाहरण प्रदान करें। OpenAL का एक आसान कार्यान्वयन -

  4. हो सकता है कि वहाँ ObjectAL की तरह तीसरे पक्ष के चौखटे हैं। मुझे पता है यह आईओएस 9. में उपलब्ध है

इन विधियों सिर्फ अपनी मान्यताओं कर रहे हैं। लेकिन उनका मुख्य प्रश्न वही रहता है: क्या वे विधियां पृष्ठभूमि से काम करती हैं?

+0

इस लिंक को आजमाया? http://stackoverflow.com/questions/12498015/leak-from-nsurl-and-avaudioplayer-using-arc –

+0

यह उत्तर की तरह नहीं दिखता –

+0

एआरसी अक्षम करें: http://stackoverflow.com/questions/6646052/how -can-i-disabled-arc-for-a-single-file-in-a-project – d4Rk

उत्तर

2

आपको केवल एआरसी को अक्षम करना चाहिए। जब आप बैकग्राउड दर्ज करते हैं, तो यदि आप इसका उपयोग नहीं करते हैं तो इसे जारी किया जा रहा है। स्विफ्ट में AVAudioPlayer को Unmanaged<T> ऑब्जेक्ट के रूप में बनाएं।

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