【发布时间】: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