Swift闭包里强弱引用的那些陷阱和奥秘

本文深入探讨Swift中的闭包引用循环与强弱引用问题,解释[weak self]和[unowned self]的区别,何时使用,以及如何消除引用循环的其他方法。此外,还讨论了值类型在闭包中的注意事项,揭示了值类型可能带来的意外问题。通过实例分析,帮助读者掌握Swift闭包中的核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述



问题现象

众所周知,Swift是一门安全的语言,至少比ObjC要安全。不过这篇文章里我们不会聊ObjC的ARC机制、也不谈怎么用Swift捣鼓低层指针那些事,我们只谈Swift里大家无时不刻都在使用的功能:

引用循环与闭包中的强弱引用。

即使是Swift“久经沙场”的老鸟也不敢保证能完全了解这方面的内容,更别说新手们了。

不过别担心,看完本篇后你对Swift中闭包中的“强弱”引用、引用循环等知识将会有全新的认识。

在本篇博文中,您将学到以下内容:

  • 为什么要在闭包中加上[weak self] 和[unowned self]?它们有什么区别?
  • 是不是闭包中总是要加上[weak self]?
  • 在闭包中除了用[weak/unowned self] 还有其它消除引用循环的方法吗?
  • 在闭包中强引用对象的两种方法。
  • 不会造成循环引用的值类型在闭包中使用真的是人畜无害吗?

还等什么呢?就让虎年里虎虎生风的我们一起来揭晓问题的谜底吧! &#x

Swift 中,闭包是一种自包含的函数代码块,可以在代码中被传递使用。闭包有能力捕获存储其所在上下文中任意常量变量的引用。当闭包引用了外部的对象时,为了避免循环引用(strong reference cycle),我们需要使用弱引用weak reference)。 在闭包中使用弱引用可以防止闭包持有外部对象的强引用,从而避免循环引用的问题。循环引用指的是两个或多个对象之间相互持有对方的强引用,导致它们无法被释放,造成内存泄漏。 在 Swift 中,我们可以使用 `[weak self]` 或者 `[unowned self]` 语法来声明一个对外部对象的弱引用。`[weak self]` 会将对外部对象的引用标记为弱引用,而 `[unowned self]` 则标记为无主引用。 下面是一个使用弱引用闭包示例: ```swift class SomeClass { var completionHandler: (() -> Void)? func doSomething() { completionHandler = { [weak self] in // 使用 weak self 避免循环引用 guard let self = self else { return } // 在闭包中使用 self print("Doing something in \(self)") } completionHandler?() } } let instance = SomeClass() instance.doSomething() ``` 在上面的示例中,我们使用了 `[weak self]` 来声明对外部对象的弱引用。在闭包中,我们使用了 `guard let self = self else { return }` 来确保在闭包执行时,外部对象仍然存在。这样可以避免在闭包中使用已经被释放的对象。 需要注意的是,使用弱引用可能会导致外部对象在闭包执行期间被释放,因此在闭包中使用弱引用的对象时,需要进行额外的判断以确保其存在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大熊猫侯佩

赏点钱让我买杯可乐好吗 ;)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值