每当我执行异步网络请求时,可能是在请求到达时 self 已经为 nil(例如,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()
}
})
或者我可以将 self 捕捉为无主:
future.onSuccess(context: Queue.main.context, callback: { [unowned self] result in
// Do some stuff with self
// self.someMethod()
})
我不关心请求返回,因为当请求在 ViewController 已经被关闭的时间点返回时,我没有从请求中显示任何内容。所以我不想通过关闭让自己“活着”。
我现在的问题是 - 在这种情况下将 self 捕获为无主是否足够?还是我必须一直用 [weak self] 做 nil 检查?如果在请求到达并且 self 已经为 nil 时使用 unowned 捕获会发生什么情况 - 闭包是否仍然存在并且会执行并会在访问 nil 时触发运行时错误?还是闭包也会与 self 一起解除分配,请求会遇到“无效”?
或者在这种情况下我可以同时忘记 weak 和 unowned 因为当 self get 被释放时闭包也将被释放,所以在请求到达时不存在访问 nil 的危险?
PS:我知道关于这个主题已经有很多问答,但如果我不关心异步到达,我找不到答案。
最佳答案
如果您在没有 weak
或 unowned
关键字的情况下捕获 self,您的 View Controller 将被闭包保留,并且不会在闭包结束前释放。 weak
和 unowned
之间的区别是 weak
是一个 Optional 并且需要条件绑定(bind)作为安全检查。另一方面,unowned
并不是万无一失的。它假定您的 View Controller 仍然存在,如果它不存在,它将崩溃。有关详细信息,请参阅 this answer .
关于swift - 在异步网络请求中捕获 self weak 或 unowned,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33372770/