TL;DR:继续使用[weak self]
PromiseKit 块来防止对象的寿命超过必要的时间。
有几点需要注意。首先,在块中使用有两个主要原因[weak self]
:
- 防止保留循环
- 防止物体的寿命超过必要的时间
其次,当您调用该代码块时,PromiseKit会创建一个保留周期。self
通常坚持somePromise
,并且somePromise
坚持self
。他们说你不应该关心这个保留周期的原因是因为保留周期会被 PromiseKit 自动破坏。当then
被释放时,somePromise
将不再持有self
,从而打破了保留周期。
所以我们知道我们不需要担心 PromiseKit 块的问题 #1,但是问题 #2 呢?
想象一下,一个视图控制器触发了一个网络请求承诺,并且需要 30 秒才能解决这个承诺。现在在它解决之前,用户按下后退按钮。通常 UIKit 会释放视图控制器,因为它不再在屏幕上并且系统可以节省资源。但是,由于您self
在 Promise 中引用,它不能再被释放。这意味着视图控制器在内存中的寿命将比必要的长 30 秒。
解决问题 #2 的唯一方法是[weak self]
在块内使用。
注意:有人可能会争辩说,当您的视图控制器退出时,您无论如何都应该取消正在进行的承诺,以便它释放对self
. 然而,弄清楚何时应该释放视图控制器并不是一项简单的任务。让 UIKit 为您处理逻辑要容易得多,如果您在视图控制器被释放时确实需要做任何事情,请在视图控制器的dealloc
方法中实现它。如果块强烈地保持在视图控制器上,这将不起作用。
更新:看起来其中一位作者确实谈到了这一点,并阐明了提出这些建议的原因:
事实上,保留self
可能是您想要的,以便在self
释放之前解决承诺。