/**
15.8-闭包属性引起的循环强引用问题
所谓的循环强引用,是指两个对象相互强引用指向对方。谁都不撒手,造成这两个对象都不会被系统所释放,造成内存泄漏。
那么怎么解决它呢?将其中一个对象变成弱引用指向对方,或者说持有对方。
*/
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
lazy var closure: ()->Void = {
/**
默认闭包会对它访问的对象执行强引用。
这个地方访问了self ,导致调用 该闭包的时候引用计数+1
如果闭包属性中没有直接或者间接访问self,就不会产生循环强引用。
*/
print("a=\(self.a)")
print("Closure!")
}
deinit {
print("deinit!")
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。