主要给大家介绍了关于IOS中block为何再也不需要WeakSelf弱引用的相关资料,文中通过示例代码介绍的非常详细,对各位iOS开发者们具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。 在iOS开发中,Block是一种强大的闭包特性,它允许我们将代码块当作对象处理。然而,使用Block时常常会遇到一个问题,即可能导致循环引用(retain cycle),进而引发内存泄漏。通常,我们通过使用`__weak`关键字来打破这种循环引用,但这篇文章提出了一个观点:在某些特定情况下,我们可能不再需要`__weak`弱引用。 我们需要理解Block的工作原理。Block内部会捕获其定义时所在上下文中的局部变量,包括对象。当Block作为对象存储时,它会保持对这些对象的强引用。这就是可能导致循环引用的原因。例如,如果一个Block捕获了`self`,并且这个Block被添加到一个对象的属性中,那么`self`和Block之间就形成了相互引用,导致两者都无法被释放。 文章中通过一个简单的`BlockTable`类来说明这个问题。`BlockTable`有一个Block类型的属性`addCell`,当Block中不直接引用`table`时,赋值不会增加引用计数。然而,一旦Block引用了`table`,引用计数会增加,形成循环引用,阻止对象被释放。 文章提出,当Block只执行一次时,可以考虑不使用`__weak`。因为Block执行完毕后,其内部对`self`的引用也就消失了,不会持续存在。许多情况下的Block确实只执行一次,比如事件处理或回调。在这种情况下,避免使用`__weak`可以简化代码,但前提是确保Block执行后不会保留对`self`的引用。 然而,文章还指出,Block在被赋值给属性时,会增加一次引用计数。通过使用`__weak`临时变量来间接赋值给属性,可以消除这个额外的引用。这样,即使Block内部引用了`self`,由于`__weak`的特性,不会形成循环引用,对象依然可以正常释放。 文章展示了如何在`BlockTable`中添加一个`reloadData`方法,这个方法会调用`addCell` Block。尽管Block在`reloadData`中被调用了两次,但由于之前使用了`__weak`弱引用,仍然能正确地解除引用,避免了内存泄漏。 总结来说,虽然在大多数教程中推荐在Block中使用`__weak`来防止循环引用,但实际情况是,如果能确保Block只执行一次,或者通过特定方式消除赋值时的额外引用,可以不使用`__weak`。然而,这种方法并不总是安全的,特别是当Block可能会被多次执行,或者在未知的生命周期内被保留时。因此,开发者应当谨慎对待,结合具体场景来决定是否使用`__weak`。在实际开发中,遵循最佳实践,使用`__weak`仍然是防止循环引用的一种稳妥策略。
剩余7页未读,继续阅读
- 粉丝: 5
- 资源: 894
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助