假设您想要从服务器异步加载一些文本,并在ViewController的
UITextField
中显示结果,请想象一下这种情况。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
//... some long running async operation
if let textResponse = responseFromServer {
dispatch_async(dispatch_get_main_queue(), { [weak self] () in
self?.textField.text = textResponse
})
}
})
A.) 在异步调用的闭包中,我需要使用[weak self]吗?
我曾经认为需要这样做,但在StackOverflow上阅读了一些问答并查看了很多没有在异步任务和闭包中使用[weak self]的开源应用程序之后,我不确定了。
例如:
只有在会创建强引用循环的情况下才真正需要使用[unowned self]或[weak self]。 (Swift中我们是否总是要在闭包中使用[unowned self])
在我的情况下不存在强引用循环。
或者:
但是要明确的是,在这种情况下最好仍然使用强引用。 (Swift ARC和块)
B.) 假设使用强引用没有问题。当用户在异步加载过程中导航到不同的页面时,ViewController会发生什么?它会保留不可见的ViewController直到异步任务完成而使其占用应用程序内存吗?