Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 太多AVP播放器因内存问题而终止_Ios_Swift_Avplayer_Avplayeritem - Fatal编程技术网

Ios 太多AVP播放器因内存问题而终止

Ios 太多AVP播放器因内存问题而终止,ios,swift,avplayer,avplayeritem,Ios,Swift,Avplayer,Avplayeritem,我有一个vc,里面有一个AVPlayer。从这个vc中,我可以推动一个不同的vc,里面有另一个播放器,我也可以继续推动更多的vc,里面有一个播放器。大约在第14次推送vc后,由于内存问题,终止,应用程序崩溃 当我查看内存图(左窗格中的第9个图标)时,它的大小约为70mb,因此内存中没有明显的跳跃。我所有的视频文件都保存在磁盘中并从磁盘中检索,每当我弹出vc时,我都会在Deinit中有一条打印语句,始终运行,因此没有任何其他原因导致内存问题。这让我相信了另一个SO答案,即同时限制了16AVPlay

我有一个vc,里面有一个
AVPlayer
。从这个vc中,我可以推动一个不同的vc,里面有另一个播放器,我也可以继续推动更多的vc,里面有一个播放器。大约在第14次推送vc后,由于内存问题,
终止,应用程序崩溃

当我查看内存图(左窗格中的第9个图标)时,它的大小约为70mb,因此内存中没有明显的跳跃。我所有的视频文件都保存在磁盘中并从磁盘中检索,每当我弹出vc时,我都会在
Deinit
中有一条打印语句,始终运行,因此没有任何其他原因导致内存问题。这让我相信了另一个SO答案,即同时限制了16
AVPlayers
。我认为所有这些播放器都会导致内存崩溃的原因是,一旦我注释掉播放器初始化代码,我就可以推动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)
}