欢迎屏幕中的视频使用AVPlayer导致内存泄漏?

时间:2018-01-17 03:32:13

标签: ios swift avplayer avkit

在我的应用中,有一个欢迎屏幕,包含3个屏幕。他们都从一个超级类继承。它们之间的区别仅仅是文本和视频网址:

|-SuperWelcomeScreenViewController
|----FirstWelcomeScreenViewController
|----SecondWelcomeScreenViewController
|----ThirdWelcomeScreenViewController

在超类中,我有一个加载视图的视图:

private final var player: AVPlayer = AVPlayer()
private final lazy var videoView: UIView = {
    let v = UIView()

    let videoString:String? = Bundle.main.path(forResource: self.videoPath, ofType: "mp4")
    guard let unwrappedVideoPath = videoString else {return v}

    let videoUrl = URL(fileURLWithPath: unwrappedVideoPath)
    let item = AVPlayerItem(url: videoUrl)

    self.player.replaceCurrentItem(with: item)
    let layer: AVPlayerLayer = AVPlayerLayer(player: player)

    //Using the size of the video
    layer.frame = CGRect(x: -125, y: 0, width: 250, height: 541)
    layer.videoGravity = AVLayerVideoGravity.resizeAspectFill
    v.layer.addSublayer(layer)

    return v
}()

以下是问题:我测试了模拟器上的内存使用情况,一开始大约250MB。然后我刷到下一个欢迎屏幕,它变成了450MB。接下来是550MB。我的欢迎屏幕有一个无限循环,但在3个viewcontrollers全部显示后,使用率保持最大值。

然后我进入登录界面,然后回到欢迎屏幕。最初的使用量变为750MB。如果我继续从登录屏幕和欢迎屏幕跳转,用法将继续提升!

以下是我想要做的事情:

  • 首先,当我从登录界面和欢迎屏幕跳转时,我希望内存使用保持稳定。

  • 其次,我想在欢迎屏幕之间回收内存。因此,在每个屏幕中,使用量大约为250MB。

以下是我尝试过但失败的内容:

  • player更改为static

  • 当视图显示时,从AVPlayerLayer移除superLayer

  • AVPlayer设为nil

仅供参考我在CFGetRetainCount中运行了viewDidLoad并且它是5.我找不到其他的4。

1 个答案:

答案 0 :(得分:1)

实际上下面的事情一起做了诀窍

  • 当view.disappear

  • 时,从superLayer中删除AVPlayerLayer
  • 将AVPlayer设为nil