【发布时间】:2016-01-27 03:32:15
【问题描述】:
每当我进行异步网络请求时,可能在请求到达时 self 已经为零(例如 ViewController 已经被解除)。
为了防止这种情况,我通常会认为自己很弱:
future.onSuccess(context: Queue.main.context, callback: { [weak self] result in
if let strongSelf = self {
// Do some stuff with self, which is now guaranteed to be not nil
// strongSelf.someMethod()
}
})
或者我可以将自己捕获为无主:
future.onSuccess(context: Queue.main.context, callback: { [unowned self] result in
// Do some stuff with self
// self.someMethod()
})
我不关心请求返回,因为当请求在 ViewController 已被解除的时间点返回时,我没有任何可显示的请求。所以我不想让自己在闭包中“活着”。
我现在的问题是 - 在这种情况下是否足以将自己捕获为无主?还是我必须一直对 [weak self] 进行 nil 检查?如果在请求到达并且 self 已经为零时使用请求进行无主捕获会发生什么 - 闭包是否仍然存在并且会执行并且会在访问 nil 时触发运行时错误?或者闭包是否也会与 self 一起被释放,并且请求会进入“void”?
或者我可以在这种情况下忘记弱和无主,因为当 self get 被释放时,闭包也将被释放,因此在请求到达时没有访问 nil 的危险?
PS:我知道关于这个主题已经有很多问题-答案,但是在我不关心异步到达的情况下我找不到答案。
【问题讨论】:
-
如果我们假设
future的生命周期独立于self使用的任何东西,那么使用unowned将是不安全的,因为self可能是dealloced而future和它的参考关闭继续存在。
标签: swift asynchronous closures