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.
Gibt es einen Sinn ARC (Automatic Reference Counting) zu deaktivieren manuell zu lösen und dealloc
audioPlayer
?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 ohneOpenAL
neu schreiben.Weitere Ideen? Vielleicht muss ich
Audio Units
mitRemoteIO
verwenden? Wenn es funktioniert, bitte einige Beispiele angeben.Vielleicht gibt es Dritte Frameworks wie
ObjectAL
- eine einfache Implementierung vonOpenAL
. 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?
haben Sie diesen Link versucht? http://StackOverflow.com/Questions/12498015/leak-from-nsurl-and-avaudioplayer-using-arc –
Es sieht nicht wie eine Antwort –
deaktivieren ARC: http://StackOverflow.com/Questions/6646052/how -can-i-disable-arc-für-eine-Datei-in-einem-Projekt – d4Rk