使用弱和无人修复自我关闭内存泄漏

大家好,在本文中,我只想澄清一些困惑,为什么有时我们不得不在闭包块中使用[弱自我]或[未知自我] 。 通过简单的用例,我们将对此进行讨论。 让我们开始吧。

如你所知 取消初始化 当没有SecondViewController的保留周期时,将调用该函数。 因此,以上代码没有复杂性。 您是从其他使用UINavigationController的控制器来的。 当您按下后退按钮时,控制台将显示以下消息。

因为没有保留周期,也没有内存泄漏, 所以当您返回时, deinit函数将立即触发。

现在,进入一个复杂的案例。 假设SecondViewController将从应用程序的其他部分获取通知。 因此,您需要在NotificationCenter中注册。 我们可以通过两种方式实现NotificationCenter。 一种是将选择器传递给NC,另一种是Closure。 在这里,我要关闭。

在上面的代码中,我们从NotificationCenter接收到一条消息,该消息需要显示在infoLabel中。 如果运行以上代码,则控制台如下所示。

是。 它只是空的。

好。 让我做以下更改。

您只是评论了infoLabel的设置文本,并在日志中打印了新消息。 如果您现在运行代码,则deinit函数将触发,控制台将填充“ ==========我正在腾出我的空间==========”

哦! 这到底是怎么回事。

每当我们在闭包块中使用self时 ,实际上就是在创建一个保留周期。 这意味着它的secondviewconroller保留数量增加到两个。 即使您从SecondViewController返回,也只会减少一个保留计数。 因此,SecondViewController不会脱离内存。

如何解决这个问题?

在这里,我们有两个选择。

  1. [弱自我]
  2. [无主自我]

弱者无人者之间的基本区别

弱:弱引用使对其引用的实例保持引用。 这意味着ARC不考虑对实例的引用。 请记住,如果没有其他对象对该实例进行引用,则该实例将被释放。

无主:无主引用类似于弱引用,因为它们不对所引用的实例保持强引用。 它们的作用与弱引用相同,即避免强引用循环。

总是期望无主引用具有值,而弱引用并不期望变量具有值。 您可以将nil分配给弱对象。

如果您想了解弱和无主之间的区别,请查看此链接。

要使用弱势修复此问题,代码将更改为以下代码。

我们在闭包的开头添加了[weak self] ,并为self添加了可选绑定引用会一直存在,直到对对象的强引用出现为止。 这意味着它不会增加保留数。 因此,我们的SecondViewController现在将只有一个保留计数。 当您从该屏幕返回时,将触发deinit功能。 很好,但是那又怎么样   自。 弱变量不希望其变量在内存中。 因此,变量应该是可选的。 这就是为什么我们需要保留 为了自己

现在,与无主的自我检查。

在这里,我们已经由变为无人并被删除了 自我之后。 因为无主总是期望价值 因此,它不允许进行可选绑定。

结论:封闭效果很好,风险很小。 在实现闭包时,我们必须小心一点。 每当处理全局变量时,请始终在闭包中使用weakunown

希望您喜欢这篇文章。

编码愉快!