加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

15.8 Swift闭包属性引起的循环强引用问题

发布时间:2020-12-14 06:30:48 所属栏目:百科 来源:网络整理
导读:/** 15.8- 闭包属性引起的循环强引用问题 所谓的循环强引用,是指两个对象相互强引用指向对方。谁都不撒手,造成这两个对象都不会被系统所释放,造成内存泄漏。 那么怎么解决它呢?将其中一个对象变成弱引用指向对方,或者说持有对方。 weak unowned 关键字

/**

15.8-闭包属性引起的循环强引用问题

所谓的循环强引用,是指两个对象相互强引用指向对方。谁都不撒手,造成这两个对象都不会被系统所释放,造成内存泄漏。

那么怎么解决它呢?将其中一个对象变成弱引用指向对方,或者说持有对方。

weak unowned 关键字来解决。

*/


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

}

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读