每当我进行异步网络请求时,可能会出现请求到达时self已经为nil的情况(例如ViewController已经被解除引用)。
为了防止这种情况,通常我会将self声明为weak:
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()
}
})
或者我可以将 self 捕获为 unowned:
future.onSuccess(context: Queue.main.context, callback: { [unowned self] result in
// Do some stuff with self
// self.someMethod()
})
我不在意请求是否返回,因为当请求返回时,如果 ViewController 已经被关闭,我没有办法展示请求的结果。因此,我不想通过闭包来保持 self 的“存活”状态。
我的问题是 - 在这种情况下,仅仅将 self 设置为 unowned 是否足够?还是说我必须一直使用 [weak self] 来进行 nil 检查?如果请求到达时,self 已经被设置为 nil,那么闭包还会继续存在并执行吗?会在访问 nil 时触发运行时错误吗?或者,在这种情况下,我可以忘记 weak 和 unowned 因为当 self 被释放时,闭包也会被释放,所以不存在访问 nil 的危险?
注:我知道关于这个主题已经有很多问答了,但是我在不关心异步到达时的情况下没有找到答案。
future
的生命周期与self
无关,则使用unowned
将是不安全的,因为当future
及其对闭包的引用仍然存在时,self
可能已经被释放。 - Mike Pollard