我在 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];
委托是我的视图控制器。
此代码在主运行循环上调用(没有调度队列或执行类似的选择器)。
代表对收到的数据不做任何事情 - 不保留,不复制 - 什么都不做。
问题是,当我使用新创建的项目调用此代码时 - 它表现良好 - 下载所有数据并完成没有任何问题。
但是当在我的其他应用程序中调用代码时,突然所有下载的数据都会在应用程序中留下内存占用,一段时间后内存耗尽,应用程序收到内存警告并崩溃。
您可能会说 - 您的代表保留数据而不发布它。好吧,我试图用 Instruments 找到解决方案。你猜怎么着——我的应用程序在分配时显示它在下载资源时保留了大约 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。我还尝试更改磁盘、内存中的共享缓存大小,使用其他缓存策略 - 没有任何帮助:(