Ios 弹出控制器后,网络请求返回
我在viewcontroller中发出网络请求,简化代码如下:Ios 弹出控制器后,网络请求返回,ios,objective-c,networking,httprequest,Ios,Objective C,Networking,Httprequest,我在viewcontroller中发出网络请求,简化代码如下: - (void)viewDidLoad { [super viewDidLoad]; [self http_request]; } - (void)http_request { dispatch_async(gAsynQueueT, ^{ NSString *response; NSURL *url = [NSURL URLWithString:@"http://
- (void)viewDidLoad {
[super viewDidLoad];
[self http_request];
}
- (void)http_request {
dispatch_async(gAsynQueueT, ^{
NSString *response;
NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
sleep(5); //leave some time for poping this controller
[request startSynchronous];
NSError *error = [request error];
if (!error) {
response = [request responseString];
}
dispatch_async(gMainQueueT, ^{
_data = response; //_data is an global variable
});
});
}
在网络请求返回之前,我弹出了控制器。我认为这会导致内存泄漏,因为当网络请求返回时,控制器被释放。但我没发现仪器工具有什么问题
那么,如何解释这种情况呢。谢谢~您已经使用了dispatch_async(gAsynQueueT,{…}),它将在另一个线程上运行 在块中,您并没有使用视图控制器的属性,所以我认为并没有内存泄漏的原因
块已分派到队列,因此它与视图控制器无关。在主队列中,我为属于视图控制器的属性“data”赋值。确定后,当您在块中使用视图控制器时,iOS将保留视图控制器的强引用,视图控制器对象在弹出或关闭时不会被销毁,严格地说,在ARC内存管理中,对象的引用计数变为0时会被销毁,因此,如果您使用view controller的数据属性,它将被销毁,但不会被销毁,并且在运行主队列代码块后,它将被销毁,但您无法执行任何与UI相关的操作,因为它已被销毁。我理解。但是,到底谁持有引用,队列?是的,因此视图控制器引用被传递到http_request->gAsynQueueT->gMainQueueT,这就是块(其他语言中的ramda)强大的原因。如果我将视图控制器作为代理来响应网络请求如何。同样,我在网络恢复之前弹出控制器。这会引起一些问题吗?