为什么在@nonescaping闭包中不需要[weak self]?

7 浏览
0 Comments

为什么在@nonescaping闭包中不需要[weak self]?

这个问题已经有答案了在Swift中我们是否总是应该在闭包内使用[unowned self]

根据https://stackoverflow.com/a/38144190/72437

原因是立即应用的闭包{}()被视为@noescape。它不会保留捕获的self。


https://oleb.net/blog/2016/10/optional-non-escaping-closures/

然而,使用非逃逸闭包是不可能创建引用循环的 - 编译器可以保证在函数返回时闭包已经释放了所有捕获的对象。


然而,我仍然不理解为什么@nonescaping闭包不保留self,也不需要[weak self]?有人能以更简单的方式解释这个概念吗?

admin 更改状态以发布 2023年5月22日
0
0 Comments

非逃逸闭包告诉编译器你所传递的闭包将在该函数的主体内执行,因此不需要使用 weak self

0
0 Comments

闭包不需要持有self,因为闭包本身只在创建它的函数存在期间存在(并且只要其中一个自身的函数仍在运行,self就不会消失)。因此,没有必要保留比函数调用本身更长时间的任何东西。

您只需要保留某些东西,以确保它存在至少和您自己存在的时间一样长(或需要访问该内容)。

如果闭包逃离了它创建的函数的范围,那么它就不能依赖于从那个函数作用域获取的任何东西在函数返回后仍然保持活动状态。因此,它必须自己保留这些内容。

0