【发布时间】:2015-10-12 23:05:30
【问题描述】:
我一直在每个回调中使用 [weak self],以防控制器展开并且“self”可能变为 nil。
这是正确的方法吗?
当我应该使用 [unowned self] 或都不使用时有哪些示例...假设“self”是一个会经常展开的 ViewController?
【问题讨论】:
标签: ios swift oop memory-management memory-leaks
我一直在每个回调中使用 [weak self],以防控制器展开并且“self”可能变为 nil。
这是正确的方法吗?
当我应该使用 [unowned self] 或都不使用时有哪些示例...假设“self”是一个会经常展开的 ViewController?
【问题讨论】:
标签: ios swift oop memory-management memory-leaks
如果在取消初始化self 时仍会调用回调,则使用[weak self] 是正确的。使用[unowned self] 的原因是您知道在self 消失后永远不会调用回调,但强烈捕获self 会导致保留周期。
[unowned self] 的一个例子是闭包的存在取决于self 的存在,那么很明显,如果self 消失了,闭包也将消失并且不会被调用.
【讨论】:
unowned self 在特定情况下是否安全,请使用weak self。闭包会变得更复杂一些(因为weak 使self 成为可选的)并且可能对性能有理论上的影响,但是考虑到使用__weak 引用在Objective-C 中已经很常见了,这不会是灾难性的(还有,过早优化=)。