【问题标题】:Network request comes back after the controller is popped弹出控制器后网络请求返回
【发布时间】:2015-10-08 10:31:18
【问题描述】:

我在viewcontroller中发起网络请求,简化代码如下:

- (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

        });

    });


}

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

那么,如何解释这种情况。谢谢~

【问题讨论】:

    标签: ios objective-c networking httprequest


    【解决方案1】:

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

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

    block 已经被分派到队列中,所以它与视图控制器无关。

    【讨论】:

    • 在 MainQueue 中,我将值分配给属于视图控制器的属性“数据”。
    • 好的,那么当您在块中使用视图控制器时,iOS 将保持对视图控制器的强引用,视图控制器对象在弹出或关闭时不会被销毁,严格地在 ARC 内存管理中,对象被销毁当它的引用计数变为 0 时,如果您使用视图控制器的 data 属性,它将被解除但永远不会被破坏,并且在运行该主队列代码块后它将被破坏,但是您不能执行任何与 UI 相关的操作,因为它已经被解除了.
    • 我明白了。但是,队列到底是谁持有引用?
    • 是的,所以视图控制器引用被传递给http_request -> gAsynQueueT -> gMainQueueT,这就是块(其他语言中的ramda)强大的原因。
    • 如果我让视图控制器作为代理来响应网络请求怎么样。同样,我在网络恢复之前弹出控制器。这会导致一些问题吗?
    猜你喜欢
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多