为什么在关闭模态视图控制器后从视图中删除 CAGradientLayer

Why is the CAGradientLayer removed from view after modal view controller is dismissed

我正在创建渐变层并将其添加到我的 MainViewController self.view。

override func viewDidLoad() {
    super.viewDidLoad()

    gradient = CAGradientLayer()
    gradient.frame = view.bounds
    gradient.colors = colors
    view.layer.insertSublayer(gradient, at: 0)

}

viewDidAppear里面我列举了所有的子层:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    for x in (view.layer.sublayers)! {
        print(x)
    }
}

这是我在 运行 应用程序时得到的(这是正常的):

<CAGradientLayer: 0x608000224120>
<_UILabelLayer: 0x60000009a400>
<_UILabelLayer: 0x60800009f180>
<CALayer: 0x600000422d60>
<CALayer: 0x608000223820>

然后从 MainViewController 我模态地呈现另一个 vc 然后关闭它。再次调用此 MainVC viewDidAppear 后,但这次我得到:

<_UILabelLayer: 0x60000009a400>
<_UILabelLayer: 0x60800009f180>
<CALayer: 0x600000422d60>
<CALayer: 0x608000223820>

CAGradientLayer 已从 self.view 中删除。我可以通过将我的代码从 viewDidLoad 移动到 viewDidAppear 来解决这个问题,但我想了解为什么 CAGradientLayer 在控制器被关闭后被删除。

我无法在简单的测试程序中重现您的情况。

这里有一些调试建议...

要找出从 view.layers 中删除渐变层的位置,请定义

class MyCAGradientLayer: CAGradientLayer {
    deinit {
        print("there it goes")
    }
}

并将您的 CAGradientLayer 替换为在 viewDidLoad 中本地创建的 MyCAGradientLayer

override func viewDidLoad() {
    super.viewDidLoad()

    let gradient = MyCAGradientLayer()
    gradient.frame = view.bounds
    gradient.colors = colors
    view.layer.insertSublayer(gradient, at: 0)
}

viewDidLoad 完成后,局部变量 gradient 将释放其对 gradient 的引用,并且只存在一个对 gradient 的引用(view.layers数组).

print 语句上设置断点以查看它在何处被释放。