NSURLConnection在下载大部分数据时导致内存警告

我在iOS(5.1,6.0,6.1)上面对NSURLConnection的一个令人不安的问题。
当我尝试通过http请求下载大部分数据时,我的应用程序不会将发布的数据标记为真正发布(稍后我会解释)。

我的下载代码如下所示:

NSURL *url = [NSURL URLWithString:@"http://my.server/file.zip"];  
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];  
NSURLConnection *urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];  
[urlConnection start];

代表是我的视图控制器。
这个代码在主runloop上调用(没有调度队列或执行选择器类似的东西)。
代表完全没有收到的数据 - 没有保留,没有复制 - 什么也没有。

问题是,当我用新创建的项目调用此代码时 - 它表现良好 - 下载所有数据并完成而没有任何问题。

但是当我在其他应用程序中调用代码时,突然所有下载的数据都会在应用程序中留下内存占用空间,并且一段时间后内存用完,应用程序将收到内存警告并崩溃。

你可能会说 - 你的委托保存数据并不会释放它。 那么,我试图用仪器找到解决方案。 猜猜看 - 我的应用程序在分配时显示它在下载资源时保持10 mb左右的内存! Allocations或VM Tracker上都没有显示出来。

那么,我如何知道应用程序会保留下载数据的内存空间?

这是显示我的记忆报告的代码(在本网站的某些答案中发现它 - 现在找不到它,但是:

    -(void) report_memory {  
       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 ) {  
          STLog(ST_DEBUG, @"Memory in use (in bytes): %u b ( %u mb )", info.resident_size, info.resident_size / (1024 * 1024) );  
       } else {  
          STLog(ST_DEBUG, @"Error with task_info(): %s", mach_error_string(kerr));  
       }  
   }

我的问题是 - 这里发生了什么?
为什么该应用程序显示一些内存占用?
为什么仪器显示没有过度分配?
NSURLConnection过度分配的原因是什么?

PS。 我也尝试更改磁盘,内存中的共享缓存大小,使用其他缓存策略 - 没有任何帮助:(


结果发现,当使用僵尸对象时,NSURLConnection会保留解除分配的对象。 这会阻止它们完全释放 - 因此会占用内存。

解决方案是不要在通过NSURLConnection下载大部分数据时使用僵尸对象。

链接地址: http://www.djcxy.com/p/30597.html

上一篇: NSURLConnection causing memory warning while downloading large portion of data

下一篇: Run multiple instances of NSOperation with NSURLConnection?