我正在制作一个播放播客的应用程序。问题是在创建具有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)
}