我的预感是队列在请求完成之前被释放并且涉及保留周期
不完全的。不涉及保留周期。这涉及到坚持。你正在做这件事main
功能。它退出立即地- 异步的东西(网络和随后的回调)是异步的,所以稍后会出现,if我们还有什么坚持。但我们不这样做。main
退出,这意味着整个该死的计划被拆毁,kaboom,在有机会进行任何联网之前,更不用说在联网之后回调完成处理程序了。
现在将其与现实生活中发生的事情进行对比。在真正的 iOS 应用程序中,main
does not退出,因为它调用UIApplicationMain
,循环直到应用程序终止。
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil,
NSStringFromClass([AppDelegate class]));
}
}
在该代码中,UIApplicationMain
只是继续运行,直到中止或以其他方式终止。与此同时,类和实例已经生机勃勃,并且它们持续存在,因为UIApplicationMain
不会停止。例如:
@implementation MyViewController
- (void) someMethod {
// ...
[NSURLConnection sendAsynchronousRequest:request
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
// ...
}
}
@end
现在,从某种意义上说,完全相同的事情发生了:someMethod
立即退出。但我们的程序总体仍在运行!UIApplicationMain
有一个运行循环,并且该运行循环仍在循环。因此,事情会继续下去,所以现在异步材料可以发生 - 我们可以联网,然后调用回调。