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

Ios 为什么在模态视图控制器关闭后,CAGRADENTLAYER从视图中删除,ios,swift,cagradientlayer,Ios,Swift,Cagradientlayer,我正在创建渐变层并将其添加到我的MainViewControllerself.view override func viewDidLoad() { super.viewDidLoad() gradient = CAGradientLayer() gradient.frame = view.bounds gradient.colors = colors view.layer.insertSublayer(gradient, at: 0) } 在view

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

override func viewDidLoad() {
    super.viewDidLoad()

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

}
viewdide中出现
我正在枚举所有子层:

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

    for x in (view.layer.sublayers)! {
        print(x)
    }
}
这是我运行应用程序时得到的结果(这是正常的):


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

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

下面是一些调试建议

要找出从视图中删除渐变层的位置,请定义

class MyCAGradientLayer: CAGradientLayer {
    deinit {
        print("there it goes")
    }
}
并将您的
cagradintlayer
替换为
mycagradintlayer
,它是在
viewDidLoad
中本地创建的

override func viewDidLoad() {
    super.viewDidLoad()

    let gradient = MyCAGradientLayer()
    gradient.frame = view.bounds
    gradient.colors = colors
    view.layer.insertSublayer(gradient, at: 0)
}
viewdiload
完成后,局部变量
gradient
将释放对
gradient
的引用,并且只有一个对
gradient
的引用(在
view.layers
数组中的引用)


print
语句上设置一个断点,以查看它被释放的位置。

在调用
super.viewdidispect(动画)
之前是否尝试过打印?如果我在viewwillappearded中打印,同样的问题将出现在您直接子类化
UIViewController
?如何声明
gradient
?你是如何解雇你的模态viewController的?@OrkhanAlikhanov:是的,我是UIViewController的子类
class MyCAGradientLayer: CAGradientLayer {
    deinit {
        print("there it goes")
    }
}
override func viewDidLoad() {
    super.viewDidLoad()

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