繁体   English   中英

Deinit从未在自定义UIView上调用

[英]Deinit never called on custom UIView

您好,我有一个具有4个自定义UIViewUIViewController 当我更改rootViewController时,会调用UIViewController Deinit函数,但不会在自定义UIView调用。 因此,更改根控制器后,它仍保留在内存中。 如果我在ViewControllers Deinit函数中调用myCustomView.removeFromSuperView() ,它将起作用。 但是,我不想每次都在viewcontrollers中编写它,所以我想在自定义UIView类中编写它,但是在Custom UIView中的Deinit永远不会被调用。

我如何声明自定义视图:

lazy var myCustomView = WelcomeScreenButtonView(text: getLabelText(key: SUPPORTEDSERVICES), imageName: "img")
let firstStackView = UIStackView()

override func viewDidLoad(){
//I put it inside a UIStackView
firstStackView.addArrangedSubview(myCustomView)
view.addSubView(firstStackView)
}
deinit{
//If I do it like this, It works but I don't wanna call it in here
myCustomView.removeFromSuperView()
}

我的自定义UIView类:

class WelcomeScreenButtonView: UIView {

lazy var label = UILabel()
private lazy var logoImage = UIImageView()

override init(frame: CGRect) {
    super.init(frame: frame)
    setupUI()
    setupConstraints()
}
required public init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}
deinit {
    //This one never get called
    print("WelcomeScreen Button Deinited")
    removeFromSuperview()
}
}

编辑:如果我将自定义视图更改为UIView()(所有其他代码都相同)。 它正在取消分配。 因此,我想我与自定义UIView类有关。

如果您的视图是另一个视图的子视图,则该超级视图对您的子视图具有很强的引用-显然不能将其释放。

deinit只被调用后,您的观点的引用计数降到0,所以deinit被称为你必须首先从上海华盈将其删除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM