我需要在deinit中删除UIGestureRecognizer吗?

时间:2017-11-09 18:43:38

标签: ios swift

我有自定义视图,其中包含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

1 个答案:

答案 0 :(得分:7)

视图拥有手势识别器。超级视图拥有该视图。当您的视图控制器的视图内存不足时,它不再保留其视图,然后将其释放(假设没有其他任何内容持有它们)。类似地,当标签被释放时,它释放其手势识别器。所以不,你不需要手动删除它。

但为什么要相信我的话呢?您可以将手势识别器分配给弱全局参考。在viewcontroller发布后检查引用,如果引用它的唯一内容是视图控制器的子视图,您将看到引用确实是nil。