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

时间:2019-07-25 03:07:44

标签: ios swift

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

  

原因是考虑了立即应用的闭包{}()   @无法逃避。它不会保留捕获的自我。


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

  

但是,无法使用   非转义的闭包-编译器可以保证闭包   到该函数时,将释放它捕获的所有对象   返回。


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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

非转义闭包告诉编译器,您传入的闭包将在该函数的主体内执行,因此不需要使用弱self。