tvOS app内存问题:如何解决?

时间:2017-03-18 06:07:35

标签: ios swift memory memory-management tvos

我有一个tvOS应用程序,里面有一个视频播放。 基本上有两个视频(同一视频的不同速度版本)。一个是12MB大小,另一个是1.9MB。

当应用程序启动时,它运行正常(Xcode显示191MB)。但是,当单击正常速度按钮一次时,内存将达到350MB。当我分别单击普通和快速按钮时,这会继续增加,并且一度变为1GB +。你可以看到附件。当视频结结并且应用停止时,它甚至达到了3GB。enter image description here

有没有办法解决内存问题并保存应用程序停止?

另一个问题是:在Apple TV中,我们从此应用程序转到另一个应用程序并返回,视频再次停止。但是,在模拟器中,它没有发生。有人可以帮我解决这两个问题吗?

以下是我正在使用的代码:

virtualenv

1 个答案:

答案 0 :(得分:1)

我在你的代码中看到两个问题:

  1. 每次调用playVideoWithURL方法时,都会创建新的AVPlayer实例,而不是重用已有的实例。如果要播放其他网址,可以在player媒体资源上调用replaceCurrentItem(with:)方法。
  2. 这本身有点低效,但不应该导致您描述的内存问题。我认为原因是:

    1. 每次调用loopVideo方法时,都会将闭包传递给NotificationCenter.default.addObserver。此闭包创建了对videoPlayer的强引用。您永远不会从通知中心删除观察者。
    2. 每次创建新的loopVideo实例时调用AVPlayer,这些实例永远不会被释放,从而导致您描述的内存问题。

      要解决此问题,您可以:

      • 仅在player初始化playVideoWithURL属性,然后在您想要播放其他视频时使用replaceCurrentItem
      • 也会改变"循环"逻辑,因此您只需拨打一次NotificationCenter.default.addObserver
      • 传递给NotificationCenter.default.addObserver的闭包会造成内存泄漏(请参阅this question)。您可以通过弱地捕获self来摆脱它:

        NotificationCenter.default.addObserver(forName:
          NSNotification.Name.AVPlayerItemDidPlayToEndTime,object: nil, queue: nil) { [weak self], notification in

          self?.player.seek(to: kCMTimeZero)
          self?.player.play()
        

        }

      还要记得在removeObserver课程的deinit方法中拨打VideoPlay