所以我的应用程序存在内存问题。该应用程序有一个带有MKOverlayRenderer的MKMapView,它可以在地图上加载图像。一切正常,但30-60分钟后,应用程序因内存崩溃。
使用乐器我发现NSURLConnection正在增长,因为我找不到任何其他东西(除了我不理解的所有东西)我觉得那是我的问题。
运行1-2分钟后的仪器截图:
运行12-13分钟后截图仪器:
图像在canDrawMapRect方法中像这样加载并保存到tmp文件夹(如果我关闭NSURLConnection赢得了那么高):
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
[NSURLConnection sendAsynchronousRequest:request
queue:[OperationQueues sharedOperationQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
[data writeToFile:path atomically:YES];
然后加载到drawMapRect方法中。
我尝试使用以下代码修复此问题:
的AppDelegate:
int cacheSizeMemory = 4*1024*1024; // 4MB
int cacheSizeDisk = 32*1024*1024; // 32MB
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"];
[NSURLCache setSharedURLCache:sharedCache];
NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory
diskCapacity:cacheSizeDisk
diskPath:nil];
[NSURLCache setSharedURLCache:URLCache];
的ViewController:
- (void)didReceiveMemoryWarning
{
[[NSURLCache sharedURLCache] removeAllCachedResponses];
[super didReceiveMemoryWarning];
}
请求后:[添加]
[[NSURLCache sharedURLCache] removeCachedResponseForRequest:request];
但正如你在仪器中看到的那样没有任何运气。
根据要求提供了更多来自乐器的截图:
答案 0 :(得分:2)
首先,一分钟内400个网络请求似乎相当多。其中一些请求可能是重复的或不必要的。通话量显然是下载了大量信息,并没有给os足够的时间进行清理。
其次,您的NSURLCache
实际上提供的更多内存空间比默认缓存更多。我在我的设备/模拟器上测试过,ios提供了512000字节的默认内存容量。您的缓存初始化为4 194 304字节(并且在磁盘上的方式更多)。
我建议您将缓存大小设置得更小,以便看到一些改进。但是,调查所提出的网络请求数量将提供更长期的好处。