用强/弱自我打破保留周期

2024-05-08

我读过关于强/弱的帖子self打破保留周期,但我仍然对它们如何工作感到困惑。我理解使用__weak typeof(self) weakSelf = self创建对自我的弱引用,但我对强引用感到困惑。据我了解,强引用是指对self这样它就不会在块结束之前被释放,对吗?那么为什么需要有__strong typeof(self) strongSelf = weakSelf?无论如何,这最终不会指向 self 对象吗?那么为什么不只是strongSelf = self?


在创建块时,您在块内引用的任何非弱对象都将导致该对象上的隐式保留。不是执行,而是创建。

如果您直接从 self 初始化内部的 StrongSelf,您将保留 self 的值并可能导致保留周期。

另一方面,如果你从weakSelf初始化它,你会not保留weakSelf的值。

这就是为什么要分两步走的原因。外部代码将self的值复制到weakSelf中,但是ARC没有添加retain,因为它是__weak()。

块“创建”复制了weakSelf的值(或者至少设法使其值在执行时可用)。你看不到它把它复制到哪里,但它确实复制了。

在块“执行”时,块将“weakSelf 的值”(如果同时 self 已被释放,则该值将为 nil)复制到 StrongSelf 中,然后 ARC 对其应用保留。因此,在块的持续时间内,strongSelf 引用的对象将保持活动状态(如果它一开始就处于活动状态)。如果您只依赖weakSelf,那么在块执行期间它可能随时为零。

请注意,弱/强模式是带和大括号 - 许多示例实际上依赖于这样一个事实:weakSelf 将变为 nil,并且该块将默默地成为 no-ops(nil 消息)的集合。

保留循环通常仅在以下情况下发生:(a)您在 self.property 中保留对块的引用,或者(b)您将块交给其他对象(通知管理器等),并告诉其他对象忘记它你的dealloc;在这两种情况下,当块处于活动状态时,您的 dealloc 将永远不会被调用。

当人们说“做这件事的方法是使用弱/强模式”时,他们正在假设最坏的情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用强/弱自我打破保留周期 的相关文章

随机推荐