您好,我有一个UIViewController
,其中有4个自定义UIView
。当我更改rootViewController时,将调用UIViewController
中的Deinit函数,但未在自定义UIView
中调用。因此,更改根控制器后,它仍保留在内存中。如果我在ViewControllers myCustomView.removeFromSuperView()
函数中调用Deinit
,它将起作用。但是,我不想每次都在视图控制器中编写它,所以我想在自定义UIView类中编写它,但是自定义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类有关。
答案 0 :(得分:-1)
如果您的视图是另一个视图的子视图,则该超级视图对您的子视图具有很强的引用-因此显然无法将其释放。
deinit
仅在视图的引用计数降至0后才被调用,因此要调用deinit
,必须先将其从超级视图中删除。