当视频处于循环中时,AVPlayer保留在内存中

时间:2016-12-27 13:30:26

标签: ios swift xcode swift3

我需要将玩家置于循环中,但为什么在我添加

NotificationCenter.default.addObserver(forName:NSNotification.Name.AVPlayerItemDidPlayToEndTime,object: nil, queue:nil){
 notification in
 videoPlayer.seek(to: KCMTimeZero)
 videoplayer.play()
 }
}

当我在viewController中给予dismiss时,我的视图留在内存中。 我如何重现视频,每次打开ViewController

时,我的记忆都会增加

如果没有这个代码,它就会被删除。

我不知道自己要做什么

你能帮我吗?

2 个答案:

答案 0 :(得分:5)

您的代码有三个问题:

  1. 默认情况下,引用作为强传递到块中。要确保不保留这些内容,请使用weakunowned

    NotificationCenter.default.addObserver(forName:NSNotification.Name.AVPlayerItemdidPlayToEndTime,object: nil, queue:nil){
    [weak videoPlayer] notification in
    videoPlayer?.seek(to: KCMTimeZero)
    videoplayer?.play()
    }
    
  2. 从iOS 9开始,观察者不需要从NotificationCenter 中删除,除非您正在使用块观察者(您是)。您应该将引用存储到从NotificationCenter.addObserver:forName:object:queue:usingBlock:返回的观察者:

    self.observer = NotificationCenter.default.addObserver(...)
    
  3. viewWillDissappear

    NotificationCenter.default.removeObserver(self.observer)
    

    (或者,您可以使用选择器,正如Chan Jing Hong所指出的那样;在这种情况下,不再需要删除观察者,但根据您应用的逻辑可能需要删除观察者)

    1. 您注册NSNotification.Name.AVPlayerItemdidPlayToEndTime的方式,只要任何 AVPlayerItem的播放到达结尾,您就会收到通知。为避免潜在问题,请收听当前播放项目的通知(将object:nil替换为object: playerItem

答案 1 :(得分:1)

添加到NotificationCenter时,您应该将self设置为观察者。

NotificationCenter.default.addObserver(self, selector: #selector(self.playerItemDidReachedEnd(_:)), name: Notification.Name.AVPlayerItemDidPlayToEndTime, object: nil)

这样,在您的viewWillDisappear中,您可以执行removeObserver()

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil)
}