iphone - 从"dispatch_async(dispatch_get_main_queue(),{" 块调用委托时的内存泄漏

  显示原文与译文双语对照的内容
0 0

我想从MyViewController类执行异步URL请求( 使用UrlRequestor类):


UrlRequestor * urlRequestor = [UrlRequestor alloc] init]];

我将MyViewController类设置为UrlRequestor类的委托:


urlRequestor.delegate = self;

我调用getUrlData函数:


[urlRequestor getUrlData];

UrlRequestor.m 文件调度队列中的getUrlData函数多线程调度。 它看起来是这样的:


- (void) getUrlData {
. . .....
 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
 NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
. . ....
 dispatch_async(dispatch_get_main_queue(), ^{
. . ......
 [self.delegate receivedGetData: parsedResponseData withActionCode: [NSNumber numberWithInt: DASHBOARD_REQUEST_DONE]];
 }
 }
}

在最后一行中运行了配置文件泄漏工具,并收到了内存泄漏 100%:


[self.delegate receivedGetData: parsedResponseData withActionCode: [NSNumber numberWithInt: DASHBOARD_REQUEST_DONE]];

我是iOS新手,我不知道为什么这里有内存泄漏。 感谢你的帮助。

时间: 原作者:

0 0

你正在使用块中的self 。 它导致保留周期。需要使用 __weak 引用对 self 中断保留周期。

试试这个


__weak UrlRequestor *weakSelf = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
 NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
. . ....
 dispatch_async(dispatch_get_main_queue(), ^{
. . ......
 [weakSelf.delegate receivedGetData: parsedResponseData withActionCode: [NSNumber numberWithInt: DASHBOARD_REQUEST_DONE]];
 weakSelf = nil;
 }

希望有帮助!

原作者:
...