2015-10-08 19 views
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 

     }); 

    }); 


} 

之前,我弹出控制器。我认为这应该导致内存泄漏,当网络请求返回时控制器被释放。但是我发现仪器工具没什么问题。

那么,如何扩展这种情况。谢谢〜

回答

2

你已经使用dispatch_async(gAsynQueueT,{...}),它会在另一个线程上运行。

而在块,你没有使用视图控制器的属性,所以我认为没有理由内存泄漏。

块已被调度到队列中,因此无论如何它都与视图控制器无关。

+0

在MainQueue中,我将值赋给属于视图控制器的属性'data'。 – itenyh

+0

好吧,那么iOS会在你的块中使用视图控制器的强引用,视图控制器对象在弹出或解除时不会被破坏, 严格地说,在ARC内存管理中,当引用计数变为0时,对象被销毁,因此如果使用视图控制器的数据属性,它将被解散但从不销毁,并且在运行该主队列代码块后它将被销毁,但由于它已被解散,因此无法执行任何与UI相关的操作。 – Alex

+0

我明白。但是,究竟谁拥有这个参考,队列呢? – itenyh