1
使一个视图控制器内的网络请求,简化的代码是如下:在网络请求回来网络请求回来,所述控制器被弹出后
- (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
});
});
}
之前,我弹出控制器。我认为这应该导致内存泄漏,当网络请求返回时控制器被释放。但是我发现仪器工具没什么问题。
那么,如何扩展这种情况。谢谢〜
在MainQueue中,我将值赋给属于视图控制器的属性'data'。 – itenyh
好吧,那么iOS会在你的块中使用视图控制器的强引用,视图控制器对象在弹出或解除时不会被破坏, 严格地说,在ARC内存管理中,当引用计数变为0时,对象被销毁,因此如果使用视图控制器的数据属性,它将被解散但从不销毁,并且在运行该主队列代码块后它将被销毁,但由于它已被解散,因此无法执行任何与UI相关的操作。 – Alex
我明白。但是,究竟谁拥有这个参考,队列呢? – itenyh