【发布时间】:2018-03-07 20:55:59
【问题描述】:
我正在研究 ARC 和强引用循环并遇到了我的以下代码:
class TestClass: UIView {
let button: UIButton = {
let view = UIButton()
view.frame = CGRect(x: 50, y: 50, width: 200, height: 200)
view.backgroundColor = .blue
view.translatesAutoresizingMaskIntoConstraints = false
view.setTitle("Button", for: .normal)
view.addTarget(self, action: #selector(buttonClicked), for: .touchUpInside)
return view
}()
@objc private func buttonClicked() {
print("Clicked")
}
override init(frame: CGRect) {
super.init(frame: frame)
print("Object of TestClass initialized")
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
deinit {
print("Object of TestClass deinitialized")
}
}
在闭包内的addTarget 方法中对self 的引用似乎不会创建强引用循环。
谁能解释一下原因?
另外,我注意到如果我从UIView 中删除继承,编译器就会开始抱怨:Use of unresolved identifier 'self'。
有人也可以解释一下吗,为什么在这种情况下会发生而在第一个情况下却没有?
【问题讨论】:
-
表示视图还没有被加载。您可以使用
lazy关键字声明您的变量。lazy var button: UIButton = { -
另一种选择是在
didMoveToSuperview方法中初始化你的按钮 -
@LeoDabus,我明白了。但为什么它会在 XCode 项目(单页应用程序)而不是 Playground 文件中工作?
标签: swift closures strong-references