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

时间:2017-04-23 11:38:19

标签: ios swift cagradientlayer

我正在创建一个渐变图层并将其添加到我的input type = 'file' self.view。

MainViewController

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> 我以模态方式呈现另一个vc,然后将其解雇。在再次调用MainVC MainViewController之后,这次我得到了这个:

viewDidAppear

已将<_UILabelLayer: 0x60000009a400> <_UILabelLayer: 0x60800009f180> <CALayer: 0x600000422d60> <CALayer: 0x608000223820> 从self.view中移除。我可以通过将代码从CAGradientLayer移到viewDidLoad来解决此问题,但我想了解为什么在控制器被解除后删除了viewDidAppear

1 个答案:

答案 0 :(得分:3)

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

这是一些调试建议......

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

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

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

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的一个引用({{1}中的引用数组)。

view.layers语句上设置断点,以查看它被释放的位置。