Sen*_*ful 13 retain-cycle swift promisekit
PromiseKit在其网站上声明如下:
我应该关注保留周期吗?
tl; dr:在promise承办人中使用self是安全的.
这很安全:
Run Code Online (Sandbox Code Playgroud)somePromise.then { self.doSomething() }提供
somePromise解析后,传递给的函数then将被释放,因此[weak self]不需要指定.指定[无主自我]可能很危险.
你告诉我不要担心保留周期?!
不,这只是默认情况下,使用PromiseKit时不会导致保留周期.但它仍有可能......
这是否意味着我永远不应该[weak self]在PromiseKit块中使用?有没有我还需要使用的情况[weak self]?它究竟是如何阻止保留周期的?
Sen*_*ful 13
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解除分配之前允许解析.
Rob*_*Rob 11
该文档仅仅表示您不必担心PromiseKit引入"强引用周期"(以前称为"保留周期"),因为当履行承诺并且块完成运行时,这些强引用会自动为您解决.强与弱参考的选择完全取决于您.
例如,如果您只是更新不再存在的场景上的UI元素,则无需对被解除的视图控制器保留强引用.您将weak在该场景中使用.但有时您需要强引用(例如,您可能希望更新基础模型以反映承诺的成功或失败).
最重要的是,他们所说的是你不应该让PromiseKit决定强大与弱的参考,而应该由你的应用程序更广泛的设计要求驱动.PromiseKit唯一的硬规则是你应该避免unowned.
| 归档时间: |
|
| 查看次数: |
2576 次 |
| 最近记录: |