【问题标题】:Creating AVPlayerLayer prevents releasing AVPlayer创建 AVPlayerLayer 防止释放 AVPlayer
【发布时间】:2018-01-23 05:56:19
【问题描述】:

如果我曾经设置过 AVPlayerLayer,那么会有一些保留循环会阻止 deinit 被调用。

import AVFoundation

class MyPlayer: AVPlayer {

    fileprivate(set) lazy var playerLayer: AVPlayerLayer = {
        // Create a player layer
        $0.videoGravity = AVLayerVideoGravityResizeAspectFill
        $0.backgroundColor = UIColor.black.cgColor
        return $0
    }(AVPlayerLayer(player: self))

    override init() {
        super.init()
        print("MyPlayer init")

        _ = playerLayer
    }

    deinit {
        print("MyPlayer deinit")
    }
}

用这个进行测试,只有 "MyPlayer init" 会被打印出来:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    _ = MyPlayer()

    return true
}

【问题讨论】:

  • 请停止对老问题进行毫无意义的编辑!它使它们作为新问题弹出。特别是如果您要更改自动生成的链接重复问题的名称! stackoverflow.com/questions/14600914/…
  • @Fogmeister 更正链接问题的标题似乎很重要。
  • 链接问题的标题已编辑...在链接中添加“a”仍然有效。除了现在我去重新打开这个问题,因为我认为它被匆忙关闭了。当我意识到它已经快5岁时,我正要回答。当然,如果答案发生了巨大变化,请重新提出一个问题。但链接仍然有效。没有什么明显的变化。

标签: ios swift avplayer retain-cycle avplayerlayer


【解决方案1】:

AVPlayerLayer 保留了对播放器的强引用,因此您不应保留播放器本身对 playerLayer 的强引用。

解决方案 1

如果你不打算移除子层,那么超级层会为你保留引用,所以你可以使用weak

private weak var _playerLayer: AVPlayerLayer?
var playerLayer: AVPlayerLayer! {
    if let p = _playerLayer {
        return p
    }
    let p: AVPlayerLayer = {
        // Create a player layer
        $0.videoGravity = AVLayerVideoGravityResizeAspectFill
        $0.backgroundColor = UIColor.black.cgColor
        return $0
    }(AVPlayerLayer(player: self))
    _playerLayer = p
    return p
}

解决方案 2

如果您打算删除并重新添加子图层,那么您需要在您的 UIView、UIViewController 或 playerLayer 的其他管理器中创建强引用变量。

【讨论】:

    【解决方案2】:

    在您的代码中 MyPlayer 保留对 playerLayer 属性的引用。并且playerLayer 属性保持对MyPlayer 的引用。这就是 make retain 循环。

    作为解决方案,您不需要在播放器类中存储 playerLayer 属性。或者你可以创建一些装饰器类来管理玩家和他的层

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      • 2012-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-24
      • 1970-01-01
      相关资源
      最近更新 更多