AVPlayer播放在线音频流时内存泄漏



我正在制作一个播放播客的应用程序。问题是在创建具有URL或AVPlayer项目的AVPlayer时。发生了内存泄漏,但deinit运行良好,没有问题。

weak var presenter: AudioPlayerUpdaterProtocol?
private var audioSession: AVAudioSession?
private var audioPlayer: AVPlayer?
private var audioURL: URL?
private var playbackTimeUpdater: Timer?
deinit {
self.audioSession = nil
self.audioURL = nil
self.audioPlayer = nil
self.playbackTimeUpdater?.invalidate()
removeEndPlayingObserver()
print("deinit audio")
}
private func setupAudioPlayer(){

guard let url = audioURL else {
return
}

let playerItem = AVPlayerItem(url: URL)
// when comment the avplear init no memory leaks found.
audioPlayer = AVPlayer(playerItem: playerItem)

addEndPlayingObserver()
startPlaying()

}

在仪器调试时,我得到了这个

在此处输入图像描述

我试图在Xcode上调试这个malloc 16字节,但我失败了,因为对象不在任何内存图中。

这是因为在AVPlayer上设置AVPlayerItem会在两者之间创建一个隐藏的强引用,因此持久化AVPlayerItem会挂到AVPlayer上,导致内存泄漏。当需要将AVPlayerItem分配给AVPlayer时,通过创建一个新的AVPlayerEntry,使AVPlayerItem:AVPlayer具有1:1的关系。

guard let url = audioURL else {
return
}
let originalAsset = AVAsset(url: url)
audioPlayer = AVPlayer(playerItem: AVPlayerItem(asset: originalAsset))

如果以上方法对你没有帮助,请在你的视图上尝试DidDissapear:

func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
self.audioPlayer?.replaceCurrentItem(with: nil)
}

最新更新