Ios 太多AVP播放器因内存问题而终止
我有一个vc,里面有一个Ios 太多AVP播放器因内存问题而终止,ios,swift,avplayer,avplayeritem,Ios,Swift,Avplayer,Avplayeritem,我有一个vc,里面有一个AVPlayer。从这个vc中,我可以推动一个不同的vc,里面有另一个播放器,我也可以继续推动更多的vc,里面有一个播放器。大约在第14次推送vc后,由于内存问题,终止,应用程序崩溃 当我查看内存图(左窗格中的第9个图标)时,它的大小约为70mb,因此内存中没有明显的跳跃。我所有的视频文件都保存在磁盘中并从磁盘中检索,每当我弹出vc时,我都会在Deinit中有一条打印语句,始终运行,因此没有任何其他原因导致内存问题。这让我相信了另一个SO答案,即同时限制了16AVPlay
AVPlayer
。从这个vc中,我可以推动一个不同的vc,里面有另一个播放器,我也可以继续推动更多的vc,里面有一个播放器。大约在第14次推送vc后,由于内存问题,终止,应用程序崩溃
当我查看内存图(左窗格中的第9个图标)时,它的大小约为70mb,因此内存中没有明显的跳跃。我所有的视频文件都保存在磁盘中并从磁盘中检索,每当我弹出vc时,我都会在Deinit
中有一条打印语句,始终运行,因此没有任何其他原因导致内存问题。这让我相信了另一个SO答案,即同时限制了16AVPlayers
。我认为所有这些播放器都会导致内存崩溃的原因是,一旦我注释掉播放器初始化代码,我就可以推动30vcs,而不会发生任何崩溃
player?.replaceCurrentItem(with: nil)
我正要在viewwilldefine/viewdidefine
中从父vc中完全删除播放器、playerItem、其观测者和播放器层,然后在弹出子窗口后,在viewwillbeen/viewdidefine
中再次初始化所有内容,但后来我发现
平台对共享视频“渲染管道”数量的限制
在设备上的应用程序之间。结果是,将AVPlayer设置为
nil不会释放播放管道,它实际上是
playerItem与在中创建管道的玩家的关联
第一名
这上面说
这不是对AVPlayer实例数量的限制,或者
阿夫普拉厄利特姆。相反,它是AVPlayerItem与
创建“渲染管道”的AVPlayer
问题是,当推/弹出一个新的vc(里面会有一个播放器)时,我是否需要完全删除/读取与播放器相关的所有内容,或者将AVPlayerItem
设置为nil
然后重新初始化它来解决问题
如果渲染管道导致了问题,那么限制似乎不在玩家身上,而是在玩家身上
代码:
我刚刚测试了它,并将其设置为零,然后重新初始化它,这样我就可以在30台vcs上安装一个AVPlayer
,而不会发生任何崩溃
player?.replaceCurrentItem(with: nil)
因此,问题不在于AVPlayers
的总量,而在于AVPlayerItem与AVPlayer的关联,它创建了一个“渲染管道”
,而导致问题的原因是太多了
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// !isMovingToParent only runs when popping back, *** I haven't tested it with presentation/dismissal ***
if !isMovingToParent {
if let playerItem = playerItem {
self.player?.replaceCurrentItem(with: playerItem)
}
}
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.player?.replaceCurrentItem(with: nil)
}