2015-07-03 15 views
12

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.

  1. 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?

  2. 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ần OpenAL.

  3. Còn ý tưởng nào nữa không? Có lẽ tôi cần phải sử dụng Audio Units với RemoteIO? Nếu nó sẽ hoạt động, hãy cung cấp một số ví dụ.

  4. Có thể có khung bên thứ ba như ObjectAL - triển khai dễ dàng OpenAL. 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?

+0

đã thử liên kết này? http://stackoverflow.com/questions/12498015/leak-from-nsurl-and-avaudioplayer-using-arc –

+0

Nó không giống như một câu trả lời –

+0

Vô hiệu hóa ARC: http://stackoverflow.com/questions/6646052/how -can-i-disable-arc-cho-a-single-file-in-a-project – d4Rk

Trả lời

2

Bạn chỉ cần tắt ARC. Khi bạn nhập backgroud, sau đó nếu bạn không sử dụng nó nó đang được phát hành. Trong Swift tạo AVAudioPlayer làm đối tượng Unmanaged<T>.

Các vấn đề liên quan