为什么@nonescaping闭包不需要[弱自我]?

Che*_*eng 1 ios swift

根据/sf/answers/2670093331/

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


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

但是,用非转义的闭包创建引用循环是不可能的-编译器可以保证闭包将释放在函数返回时捕获的所有对象。


但是,我仍然不明白为什么@nonescaping不保留闭包self,并且不需要[weak self]?有人可以用更简单的方式解释这个概念吗?

Thi*_*ilo 5

闭包不需要保留self,因为闭包本身只存在于创建它的函数中(self只要它自己的函数之一仍在运行,它就不会消失)。因此,没有什么比函数调用本身保留更长时间的了。

您只需要保留某些东西,以确保(至少)只要您自己存在(或需要访问该东西)就存在。

如果闭包在逃避创建它的函数的作用域,则它不能依赖于该函数返回后从该函数的作用域得到的任何东西都保持活动状态。因此,它必须保留这些东西本身。