NSURLConnection正在增加仪器,这是NSURLCache吗?

时间:2014-12-22 21:02:53

标签: ios nsurlconnection instruments didreceivememorywarning nsurlcache

所以我的应用程序存在内存问题。该应用程序有一个带有MKOverlayRenderer的MKMapView,它可以在地图上加载图像。一切正常,但30-60分钟后,应用程序因内存崩溃。

使用乐器我发现NSURLConnection正在增长,因为我找不到任何其他东西(除了我不理解的所有东西)我觉得那是我的问题。

运行1-2分钟后的仪器截图:

instruments NSURLConnection

运行12-13分钟后截图仪器: instruments after 12-13 minutes

图像在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];

但正如你在仪器中看到的那样没有任何运气。

  1. 这可能是我的问题吗?
  2. 这是NSURLCache正在成长还是其他什么?
  3. 根据要求提供了更多来自乐器的截图:

    statistics enter image description here

1 个答案:

答案 0 :(得分:2)

首先,一分钟内400个网络请求似乎相当多。其中一些请求可能是重复的或不必要的。通话量显然是下载了大量信息,并没有给os足够的时间进行清理。

其次,您的NSURLCache实际上提供的更多内存空间比默认缓存更多。我在我的设备/模拟器上测试过,ios提供了512000字节的默认内存容量。您的缓存初始化为4 194 304字节(并且在磁盘上的方式更多)。

我建议您将缓存大小设置得更小,以便看到一些改进。但是,调查所提出的网络请求数量将提供更长期的好处。