2013-02-07 42 views
0

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

我下载的代码如下所示:

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。我尝试了也改变磁盘,内存中的共享缓存大小,使用其他缓存策略 - 没有任何帮助:(

回答

2

原来,当使用僵尸对象,NSURLConnection保持释放对象。这会阻止它们完全释放 - 因此会占用内存。

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

+0

如何禁用僵尸对象? –

+0

http://stackoverflow.com/questions/5386160/how-to-enable-nszombie-in-xcode –