15.9 Swift解决闭包引起的循环强引用问题
/** 15.9-解决闭包引起的循环强引用问题 */
var cr: CycleRef? = CycleRef.init() // 引用计数为1
// 我们知道延迟存储属性,第一次访问的时候才初始化。 cr!.closure() // 引用计数为 +1
cr = nil // 引用计数为-1
/** 我们可以看到如果不执行 cr!.closure() 的话,会打印出 deinit!, 那么执行了 cr!.closure(),产生了循环引用,没有打印出 deinit!
两个对象:闭包对象,cr指向的对象。 前提:闭包或者函数是引用数据类型。 */ class CycleRef { var a: Int = 9
/** weak 和 unowned不能修饰闭包, 那么如何解决闭包强引用呢? 系统有默认解决方法, 捕获列表
// 一般使用这个,unowned修饰非可选类型,所以下面访问self不需要解包 [unowned self] in
// 用weak 修饰可选类型, 所以下面访问self! 要解包 [weak self] in */ lazy var closure: ()->Void = {
/** 默认闭包会对它访问的对象执行强引用。 这个地方访问了self ,导致调用 该闭包的时候引用计数+1 如果闭包属性中没有直接或者间接访问self,就不会产生循环强引用。 */
[unowned self] in print("a=(self.a)")
// [weak self] in // print("a=(self!.a)")
print("Closure!") }
deinit { print("deinit!") } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |