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 吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥仪器中的分配图显示没有增加而标记的代数显示内存增长

iOS:识别虚拟内存分配的来源

仪器仪表行业B2B电子商务系统大数据驱动,精准构造用户画像

仪器仪表行业分销渠道系统:实现渠道互联网化,与渠道商互利共赢

矩阵中不断增长的子串的长度

嵌入在 iframe 中的 Three.js 在 iOS 8/9 中不断增长