ios - AVPlayer 在视频循环时保存在内存中

标签 ios swift xcode swift3

我需要让一个播放器循环,但为什么当我添加

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

当我在我的 viewController 中关闭时,我的 View 保留在内存中。 我如何重现视频 每次打开 ViewController 时,我的内存力都会增加

如果没有此代码,它会被成功删除。

我不知道我该做什么

你能帮帮我吗?

最佳答案

您的代码存在三个问题:

  1. 默认情况下,引用作为强引用传递到 block 中。为确保它们不被保留,请使用 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 中删除观察者 除非您正在使用 block 观察者(您就是)。您应该存储对从 NotificationCenter.addObserver:forName:object:queue:usingBlock::

    返回的观察者的引用
    self.observer = NotificationCenter.default.addObserver(...)
    

viewWillDissappear 中:

NotificationCenter.default.removeObserver(self.observer)

(或者,您可以改用选择器,正如 Chan Jing Hong 所指出的;在这种情况下,不再需要移除观察者,但可能需要,具体取决于您应用的逻辑)

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

关于ios - AVPlayer 在视频循环时保存在内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41346138/

相关文章:

ios - 更改特定的单元格背景颜色

ios - 如何快速从 UItextfield 读取特定格式( XXX.X )?

swift - UITableView 在调用 reloadData 方法时返回 nil

ios - Swift 惰性初始化不符合协议(protocol)

ios - 如何从 safari 中打开应用程序 (swift)

xcode - 如何同时发送一定数量的 POST/GET 请求?

xcode - 无法在界面构建器中打开库窗口

ios - Xcode - 带有枚举的 typedef - 预期为 '}'

ios - UI 搜索栏。无法更改框架

html - 如何在 TextView 中显示 HTML 文本