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

时间:2013-02-07 13:19:50

标签: ios memory download warnings 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。我还尝试在磁盘上更改共享缓存大小,在内存中使用其他缓存策略 - 没有任何帮助:(

1 个答案:

答案 0 :(得分:2)

事实证明,当使用僵尸对象时,NSURLConnection会保留释放的对象。这可以防止它们完全解除分配 - 从而阻止内存占用。

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