我正在制作一个'互动地图',类似于this example。我需要能够放大地图并仍然得到一个干净的插图,因此地图的绘制是在svg中完成的(它实际上是在Illustrator中创建的,然后保存为svg文件)。
在应用程序中,我创建一个UIWebView并加载包含svg的html。 HTML文件是应用程序中的捆绑包资源,因此没有网络延迟。有一些可点击的形状,当你点击它们时,它会带你到另一个地图(另一个带有svg绘图的html页面)。
其中一个svg相当大(~5.8MB)。加载时,我收到“内存压力”警告,然后崩溃。仪器显示故障时虚拟内存为298.71MB,实内存为149.10MB。
我已经简化了绘图(我拿出了一些细节),我还使用了@Peter Collingridge svg optimizer。
如何优化内存使用以免崩溃?
答案 0 :(得分:1)
我解决了我的问题:
在调用viewWillAppear:
之前,我在[super viewWillAppear:animated]
方法中创建了webview。我最初这样做是因为我有一个超类,它为我拥有的所有不同的地图实例化公共元素,并且元素以正确的顺序出现。对super的调用现在在其他任何事情之前完成,我将元素放在前面。
我现在将webview设置为nil,然后再创建并推送另一个地图(所以另一个webview包含其他内容)。
第一个webview是由故事板创建的。它现在都是用代码完成的。
地图的图纸已经简化,因此文件更小。 (更少细节)
内存报告显示,Memory Utilized现在约为81.9 Mb(iPod Touch第5代可用内存的16.2%)。
我发现奇怪的是我有一个(相当)小的svg文件的内存压力警告。此外,量具显示百分比从未高于50%。我没有考虑JS引擎和webview内存限制。 (根据报道here,据说Javascript引擎在iOS 8中获得全部功能。 (我无法找到有关内存限制的任何官方文档,可能因为它似乎因设备而异。See this answer。)
最后,在我的iPhone 4s或iPod Touch第5代上加载页面的时间仍然很长,但它确实有效。如果您想建议一种更好的方法来实现这种地图,欢迎您这样做。