NSURLConnection 在仪器中不断增长,这是 NSURLCache 吗?
Posted
技术标签:
【中文标题】NSURLConnection 在仪器中不断增长,这是 NSURLCache 吗?【英文标题】:NSURLConnection is growing in instruments, is this NSURLCache? 【发布时间】:2014-12-22 21:02:53 【问题描述】:所以我的应用程序存在内存问题。该应用程序有一个带有 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];
但正如您在 Instruments 中看到的那样,没有任何运气。
-
这是我的问题吗?
这是正在增长的 NSURLCache 还是其他什么?
应要求提供更多来自仪器的屏幕截图:
【问题讨论】:
您能否通过单击+[NSURLConnection _resourceLoadLoop]
旁边的三角形打开调用树?
另外,是什么让你认为这与NSURLCache
有关?
除了“调用树”视图,能不能给我们展示一下“统计”页面?我还假设您没有打开僵尸(因为这会阻止内存被完全释放)?我的标准方法是关注“统计”页面,确保在 Instruments 中打开“记录引用计数”,找到我应该释放但没有释放的对象,然后深入研究引用计数详细信息以计算找出对象的(不正确的)强引用在哪里。
TX!添加了屏幕。我认为它是 NSURLCache 因为我想不出别的东西,如果我注释掉那里的 NSURLConnection ,那么 NSURLConnection 的内存就不会增长。僵尸确实被关闭了,我很难理解统计页面。记录引用计数已开启。
发出了多少网络请求/多久调用一次canDrawMapRect
?要真正测试NSURLCache
,您应该将cacheSize 设置为0。(另外,在您的代码sn-p 中,您只需setSharedURLCache
一次)
【参考方案1】:
首先,一分钟内 400 个网络请求似乎相当多。其中一些请求可能是重复的或不必要的。调用量显然是在下载大量信息,并没有给 os 太多时间进行清理。
其次,您的NSURLCache
实际上提供了比默认缓存更多 的内存空间。我在我的设备/模拟器上进行了测试,ios 提供了 512 000 字节的默认内存容量。您的缓存被初始化为 4 194 304 字节(磁盘上还有更多)。
我建议您将缓存大小设置得更小以查看一些改进。但是,调查发出的网络请求的数量将提供长期利益。
【讨论】:
感谢您也指向 400 个请求,我发现了一些东西:使用带有倾斜的 MKMapCamera 会导致这些高数量,因为对于每个缩放级别,都需要一个图像,并且倾斜您会看到地图差异。缩放级别。现在没有 3D,它就少了很多。此外,我在 1 秒内进行了文件缓存,只是为了尽可能快地重现错误,因此 400 不是生产中的实际数字。现在以 100m/s (360km/h) 的速度行驶时 5 分钟内有 500 个请求。第一个地图缩放到这些位置已经引起了 100 个请求。以上是关于NSURLConnection 在仪器中不断增长,这是 NSURLCache 吗?的主要内容,如果未能解决你的问题,请参考以下文章