我有自定义视图,其中包含UILabel
,我在init中为此标签添加了手势识别器。
protocol CustomViewDelegate: class {
func customViewDidTapOnLabel(_ customView)
}
class CustomView: UIView {
lazy var label = UILabel()
weak var delegate: CustomViewDelegate?
override init(frame: CGRect) {
super.init(frame: frame)
addSubview(label)
label.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(labelTapped))
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
@objc func labelTapped() {
delegate?.customViewDidTapOnLabel(self)
}
}
问题是,我应该删除deinit中的手势识别器吗?标签是否保留强引用UITapGestureRecognizer
?
答案 0 :(得分:7)
视图拥有手势识别器。超级视图拥有该视图。当您的视图控制器的视图内存不足时,它不再保留其视图,然后将其释放(假设没有其他任何内容持有它们)。类似地,当标签被释放时,它释放其手势识别器。所以不,你不需要手动删除它。
但为什么要相信我的话呢?您可以将手势识别器分配给弱全局参考。在viewcontroller发布后检查引用,如果引用它的唯一内容是视图控制器的子视图,您将看到引用确实是nil。