在我的应用程序中,有一个由 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 个视图控制器全部显示后,使用率保持在最大值。
然后我去了登录屏幕,然后回到欢迎屏幕。初始使用量变为 750MB。如果我不断从登录屏幕和欢迎屏幕跳转,使用量将不断提高!
这是我想做的事情:
首先,当我从登录屏幕和欢迎屏幕跳转时,我希望内存使用保持稳定。
其次,我想在欢迎屏幕之间回收内存。因此,在每个屏幕中,使用量大约为 250MB。
以下是我尝试过但失败的方法:
更改
player
为static
AVPlayerLayer
从superLayer
视图将消失时移除设置
AVPlayer
为零
仅供参考,我跑CFGetRetainCount
进去viewDidLoad
是 5 个。我找不到其他 4 个。