所以我的应用程序存在内存问题.该应用程序有一个带有MKOverlayRenderer的MKMapView,它可以在地图上加载图像.一切正常,但30-60分钟后应用程序因内存崩溃.
使用Instruments我发现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];
视图控制器:
- (void)didReceiveMemoryWarning
{
[[NSURLCache sharedURLCache] removeAllCachedResponses];
[super didReceiveMemoryWarning];
}
请求后:[已添加]
[[NSURLCache sharedURLCache] removeCachedResponseForRequest:request];
但正如你在仪器中看到的那样没有任何运气.
>这可能是我的问题吗?
>这是NSURLCache正在增长还是其他什么?
根据要求提供了更多来自乐器的截图:
最佳答案 首先,一分钟内400个网络请求似乎相当过分.其中一些请求可能是重复的或不必要的.呼叫量显然是下载了大量信息,并没有给os很多时间进行清理.
其次,NSURLCache实际上提供的内存空间比默认缓存多.我在我的设备/模拟器上测试过,ios提供了512000字节的默认内存容量.您的缓存初始化为4 194 304字节(并且在磁盘上的方式更多).
我建议您将缓存大小设置得更小,以便看到一些改进.但是,调查所提出的网络请求数量将提供更长期的好处.