15.9 Swift解决闭包引起的循环强引用问题

15.9 Swift解决闭包引起的循环强引用问题,第1张

概述        /**          15.9-解决闭包引起的循环强引用问题          */                  var cr: CycleRef? = CycleRef.init()  // 引用计数为1                  // 我们知道延迟存储属性,第一次访问的时候才初始化。         cr!.closure()  // 引用计数为 +1   

/**

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!")

}

}

总结

以上是内存溢出为你收集整理的15.9 Swift解决闭包引起的循环强引用问题全部内容,希望文章能够帮你解决15.9 Swift解决闭包引起的循环强引用问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1067821.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存