Tôi có một phiên bản AVAudioPlayer tải âm thanh trong bộ nhớ với audioPlayer.prepareToPlay()
, và sau đó sau khi bắt đầu phát âm thanh đó. Tôi có một vấn đề trong khoảng mười phút sau khi vào nền, nó rò rỉ từ bộ nhớ và tôi không chuẩn bị. Sau giờ ăn đó, tôi không có khả năng chạy lại prepareToPlay()
. Làm cách nào để lại âm thanh được tải sẵn trong bộ nhớ trong một thời gian dài? Tôi đang chuẩn bị âm thanh để chơi trong applicationDidFinishLaunchingWithOptions
phương pháp:AVAudioPlayer bị rò rỉ âm thanh tải sẵn từ bộ nhớ
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")
}
})
Sau đó, trong didReceiveRemoteNotification
Tôi cố gắng để chơi nó ở chế độ nền: self.audioPlayer?.play()
, nó lợi nhuận true
. Có lẽ nó hoạt động, nhưng sau khoảng 10 - 20 phút nó không hoạt động. Và lưu ý rằng .play()
hiện tại trả lại false
.
Có một cảm giác vô hiệu hóa ARC (Automatic Đếm tham khảo) để giải phóng và dealloc
audioPlayer
cách thủ công?Có thể tôi cần sử dụng các API cấp thấp hơn như
OpenAL
? Tuy nhiên tôi sẽ không sử dụng nó vì nó không được chấp nhận trong iOS 9 và sau đó tôi sẽ cần phải viết lại nó mà không cầnOpenAL
.Còn ý tưởng nào nữa không? Có lẽ tôi cần phải sử dụng
Audio Units
vớiRemoteIO
? Nếu nó sẽ hoạt động, hãy cung cấp một số ví dụ.Có thể có khung bên thứ ba như
ObjectAL
- triển khai dễ dàngOpenAL
. Như tôi biết nó có sẵn trong iOS 9.
Những phương pháp này chỉ là giả định của tôi. Nhưng câu hỏi chính của họ vẫn giữ nguyên: Các phương pháp đó có hoạt động không?
đã thử liên kết này? http://stackoverflow.com/questions/12498015/leak-from-nsurl-and-avaudioplayer-using-arc –
Nó không giống như một câu trả lời –
Vô hiệu hóa ARC: http://stackoverflow.com/questions/6646052/how -can-i-disable-arc-cho-a-single-file-in-a-project – d4Rk