繁体   English   中英

使用NSURLConnection和dispatch_async时的内存永远不会释放

[英]Memory when using NSURLConnection and dispatch_async never gets released

为了了解东西的工作原理,我编写了一个带有启动按钮的简单iPhone应用程序。 按下该按钮将触发一个操作,以执行以下操作:

- (IBAction)start:(id)sender {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    @autoreleasepool {
        NSString *urlString = @"http://www.aftonbladet.se";
        NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
        NSHTTPURLResponse *response = nil;
        NSError *error = nil;
        NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
        if (error) {
            NSLog(@"Error: %@", [error localizedDescription]);
        }
        if (data) {
            NSLog(@"Data length: %d", [data length]);
        }
        if (response) {
            NSLog(@"Status code: %d", [(NSHTTPURLResponse*)response statusCode]);
        }
        [ViewController ReportMemory];
      }
});

}

ReportMemory函数如下所示:

+ (void)ReportMemory {
struct task_basic_info info;
mach_msg_type_number_t size = sizeof(info);
kern_return_t kerr = task_info(mach_task_self(),
                               TASK_BASIC_INFO,
                               (task_info_t)&info,
                               &size);
if( kerr == KERN_SUCCESS ) {
    NSLog(@"Memory in use: %u kB", info.resident_size/1024);
} else {
    NSLog(@"Error with task_info(): %s", mach_error_string(kerr));
}

}

我读过全局队列有自动释放池,但是它们只是间歇地清空,因此我尝试了使用@autoreleasepool宏和不使用@autoreleasepool宏,并且在内存使用方面看不到任何区别。

问题是,为什么每次按下开始按钮时ReportMemory都会显示越来越多的已使用内存? 我本以为自动发布池在某个时候会被清空。 但就我而言,它一直累加直到收到一些内存警告为止,并且当ReportMemory报告已使用约400MB时,该应用程序将关闭。

请注意,像这样使用sendSynchronousRequest仅用于演示目的。

我运行了您在“分配工具”中发布的代码,并且从此cookie的一次边际调用中看到的唯一可观的堆增长是来自HTTP cookie存储。 敲一分钟左右,堆分配看起来像这样:

仪器堆跟踪

简而言之,它会增长,但是偶尔会释放大量的累积资源。 我怀疑此代码未捕获其他正在发生的事情。 您应该在Instruments中运行(整个)应用程序,然后看看发生了什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM