作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
您好,我有一个UIViewController
,其中有4个自定义UIView
。当我更改rootViewController时,会在UIViewController
中调用Deinit函数,但在自定义UIView
中不会调用它。因此,更改根控制器后,它仍保留在内存中。如果我在ViewControllers的myCustomView.removeFromSuperView()
函数中调用Deinit
,它将起作用。但是,我不想每次都在viewcontrollers中编写它,所以我想在自定义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()
}
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()
}
}
最佳答案
如果您的视图是另一个视图的子视图,则该 super 视图对您的子视图有很强的引用-因此显然无法将其释放。
仅在视图的引用计数降至0后才调用deinit
,因此要调用deinit
,必须首先将其从 super 视图中删除。
关于ios - Deinit从未在自定义UIView上调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51045882/
背景 我最近在 merge 期间遇到了一个意外未 merge 的文档文件的问题。 无论出于何种原因,我搞砸了 merge 并有效地删除了文件(和其他几个文件),因为我忘记了它们的存在。 现在我想查看我
我在我的网站上使用旧的 mysql 版本和 php 版本 4。 我的表结构: | orders_status_history_id | orders_id | orders_status_id |
我是一名优秀的程序员,十分优秀!