【问题标题】:UIView holds a strong referenceUIView 持有强引用
【发布时间】:2016-06-13 09:04:48
【问题描述】:

我有这样的代码

let view = UIView(x: x, y: y, w: sideSize, h: sideSize)
view.addTapGesture(action: { [weak self] (UITapGestureRecognizer) -> () in
    view.reversePop()
})

extension UIView {
    public func reversePop() {
        // nothing here
    }
}

当我使用仪器时,我发现内存使用量增加了,因此它不会释放内存。当我注释掉 button.reversePop() 时,内存使用量不会增加。

如何防止内存泄漏?

【问题讨论】:

  • 为什么要在UIButton 上添加UITapGestureRecognizerUIButton 可以自己处理水龙头,无需识别器。内存使用量增加并不是内存泄漏的可靠检测。可能没有内存泄漏。
  • 修复它,现在是它的 uiview
  • 那么你认为堆线性增加的原因是什么?
  • 我查明了泄漏点。其余代码全部注释掉。当我注释掉时, view.reversePop() = 没问题,当我这样离开时 = 问题

标签: ios swift memory-leaks weak-references


【解决方案1】:

在此闭包中,您每次点击时都会捕获视图。你需要使用 UIView 的弱引用,所以你的代码可能看起来像

let view = UIView(x: x, y: y, w: sideSize, h: sideSize)
view.addTapGesture(action: { [weak view] (UITapGestureRecognizer) -> () in
    view.reversePop()
})

extension UIView {
    public func reversePop() {
        // nothing here
    }
}

所以,你需要使用[weak view],而不是[weak self]因为你没有在闭包中调用self,不需要弱化self。 p>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    • 2011-04-04
    • 2012-12-22
    • 2019-05-16
    相关资源
    最近更新 更多