问题
记录一个内存泄漏的案例,闭包引用自己或者多个对象,导致对象无法正常销毁,从而导致内存泄漏。
let view = UIView()
view.callback = { [weak self] in
guard let self = self else { return }
self.backgroundColor = view.backgroundColor
}
上面例子的闭包中,不仅引用了self
, 还有view
,虽然self
是弱引用可以正常销毁,但是由于view
自己引用了自己,无法正常销毁。所以这种情况得特别注意。
解决方案
那么这种情况怎么处理呢?
- 其实可以采闭包里面定义多个弱引用(推荐)
let view = UIView()
view.callback = { [weak self, weak view] in
guard let self = self, let view = view else { return }
self.backgroundColor = view.backgroundColor
}
- 外部进行弱引用(不推荐)
let view = UIView()
weak var weakView = view
view.callback = { [weak self] in
guard let self = self, let weakView = weakView else { return }
self.backgroundColor = weakView.backgroundColor
}
最后推荐一种弱引用的写法(仅个人见解,若有更好的意见或建议,欢迎指出)
guard let self = self else { return } // 推荐,代码侵入性最小
guard let weakSelf = self else { return } // 不推荐,虽然易理解,但代码侵入性较大
网友评论