清除MKMapView的瓷砖缓存?

Mat*_*tia 6 iphone memory-management mapkit

我正在开发一款使用MKMapView作为游戏场的iPhone游戏.仅仅几分钟的播放后,该应用程序不可避免地开始变得缓慢,并最终因内存不足而崩溃.挖掘罪魁祸首似乎是地图视图不断需要更多的记忆.游戏需要对地图进行大量的缩放和平移,因此我只能假设地图的平铺缓存一直在增长,直到内存耗尽为止.有没有办法强制地图视图刷新它的磁贴缓存或包含它的内存消耗?

M. *_*yan 4

* 注意:此答案仅与 iOS 4.1 及更低版本相关。此答案中描述的问题大部分已在 iOS 4.2 中修复*

我一直在对此进行一些挖掘,因为我的应用程序既使用地图,又具有需要高 RAM 的其他功能。

我还没有找到答案,但找到了解决方法。当您放大某个区域并在该放大区域内平移时,MKMapView 的内存需求会呈指数级增长。

MKMapView 切片缓存有两级。一种在 Instruments 中表现为 Malloc ~196kb,另一种是不同大小的 NSData(存储)。

Malloc 似乎是正在使用的活动块,并且对可以分配的数量有硬性上限。在我的应用程序中,这个数字是 16,不确定它是否基于 UIView 大小。这些分配似乎受到严格管理,并且它响应内存警告。

无论如何,在某个缩放级别,例如大陆级别(足以在 iPad 屏幕上容纳北美大部分地区),考虑到图块的大小,如果永远不需要真正达到第二级缓存(NSData(商店)) )以完成地图。一切都清爽干净。如果我将大量外部图像加载到活动内存中,图块就会自行修剪。惊人的!

当达到第二级缓存时,问题就出现了。当你放大时会发生这种情况,突然不是 16 个图块来显示整个平面,而是需要 16 个图块来展示洛杉矶,当你平移而不是仅仅转储那些旧图块时,它会将它们放入 NSData (存储)分配,它们似乎永远不会被释放。

这个NSData(存储)是NSURLConnectionCache,默认情况下仅存在于内存中。您无法访问此缓存来限制它,因为它不是默认的共享缓存(已经尝试过)。

所以这就是我陷入困境的地方。

令人不满意的答案是,如果您禁用地图缩放并将其修复在相当广泛的缩放级别,您可以完全避免这个问题,但显然有些应用程序需要这个......这就是我所得到的。

我向 Apple 提交了一份支持票,看看他们是否可以透露任何方法来限制这种荒谬的地图缓存(顺便说一句,我能够随意地在活动内存中分配高达 50+ 兆的 RAM)。

希望这可以帮助。

编辑

下一个 iOS 版本似乎已经解决了这个无限缓存问题。MKMapView 现在会积极修剪其缓存的图块数据。麾!