在uiwebview中渲染svg会导致内存压力(和应用程序崩溃)

时间:2014-03-31 21:23:01

标签: ios svg uiwebview instruments memory-pressure

我正在制作一个'互动地图',类似于this example。我需要能够放大地图并仍然得到一个干净的插图,因此地图的绘制是在svg中完成的(它实际上是在Illustrator中创建的,然后保存为svg文件)。

在应用程序中,我创建一个UIWebView并加载包含svg的html。 HTML文件是应用程序中的捆绑包资源,因此没有网络延迟。有一些可点击的形状,当你点击它们时,它会带你到另一个地图(另一个带有svg绘图的html页面)。

其中一个svg相当大(~5.8MB)。加载时,我收到“内存压力”警告,然后崩溃。仪器显示故障时虚拟内存为298.71MB,实内存为149.10MB。

我已经简化了绘图(我拿出了一些细节),我还使用了@Peter Collingridge svg optimizer

如何优化内存使用以免崩溃?

1 个答案:

答案 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代上加载页面的时间仍然很长,但它确实有效。如果您想建议一种更好的方法来实现这种地图,欢迎您这样做。