根据https://stackoverflow.com/a/38144190/72437
原因是考虑了立即应用的闭包{}() @无法逃避。它不会保留捕获的自我。
和https://oleb.net/blog/2016/10/optional-non-escaping-closures/
但是,无法使用 非转义的闭包-编译器可以保证闭包 到该函数时,将释放它捕获的所有对象 返回。
但是,我仍然不明白为什么@nonescaping
闭包不保留self
并且不需要[weak self]
吗?有人可以用更简单的方式解释这个概念吗?
答案 0 :(得分:3)
闭包不需要保留self
,因为闭包本身只存在于创建它的函数之内(而self
不会消失,只要其自身的功能之一仍在运行)。因此,没有什么比函数调用本身保留更长的时间了。
您只需要保留某些东西,以确保(至少)只要您自己存在(或需要访问该东西)就存在。
如果闭包正在转义创建它的函数的作用域,则它不能依赖该函数返回后从该函数的作用域得到的任何东西都保持活动状态。因此,它必须保留这些东西本身。
答案 1 :(得分:0)
非转义闭包告诉编译器,您传入的闭包将在该函数的主体内执行,因此不需要使用弱self。