12

Ich habe eine AVAudioPlayer-Instanz, die Sound im Speicher mit audioPlayer.prepareToPlay() lädt, und dann nach ein paar starten es zu spielen. Ich habe ein Problem, dass in ungefähr zehn Minuten nach dem Eintreten des Hintergrunds, es aus dem Gedächtnis leckt und ich nicht vorbereitet werde. Nach diesen Stunden kann ich prepareToPlay() nicht mehr ausführen. Wie kann man diesen vorgeladenen Sound für längere Zeit im Speicher belassen? Ich bereite Ton in applicationDidFinishLaunchingWithOptions Methode zu spielen:AVAudioPlayer vorinstallierten Sound Lecks aus dem Speicher

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") 
     } 
    }) 

Dann in didReceiveRemoteNotification Ich versuche es im Hintergrund zu spielen: self.audioPlayer?.play(), es kehrt true. Wahrscheinlich klappt es, aber nach ca. 10 - 20 Minuten klappt es nicht. Und beachten Sie, dass .play() jetzt false zurückgibt.

  1. Gibt es einen Sinn ARC (Automatic Reference Counting) zu deaktivieren manuell zu lösen und dealloc audioPlayer?

  2. Vielleicht muss ich niedrigere Ebenen APIs wie OpenAL verwenden? Allerdings werde ich es nicht verwenden, da es in iOS 9 und später veraltet ist, muss ich es ohne OpenAL neu schreiben.

  3. Weitere Ideen? Vielleicht muss ich Audio Units mit RemoteIO verwenden? Wenn es funktioniert, bitte einige Beispiele angeben.

  4. Vielleicht gibt es Dritte Frameworks wie ObjectAL - eine einfache Implementierung von OpenAL. Wie ich weiß, dass es in iOS 9.

Diese Methoden sind nur meine Annahmen zur Verfügung steht. Aber die Hauptfrage bleibt gleich: Funktionieren diese Methoden vom Hintergrund?

+0

haben Sie diesen Link versucht? http://StackOverflow.com/Questions/12498015/leak-from-nsurl-and-avaudioplayer-using-arc –

+0

Es sieht nicht wie eine Antwort –

+0

deaktivieren ARC: http://StackOverflow.com/Questions/6646052/how -can-i-disable-arc-für-eine-Datei-in-einem-Projekt – d4Rk

Antwort

2

Sie sollten nur ARC deaktivieren. Wenn Sie backgroud eingeben, wird es freigegeben, wenn Sie es nicht verwenden. In Swift erstellen Sie AVAudioPlayer als Unmanaged<T> Objekt.