6

我正在研究类似于此示例的“交互式地图” 。我需要能够放大地图并仍然获得清晰的插图,因此地图的绘制是在 svg 中完成的(它实际上是在 Illustrator 中创建的,然后保存为 svg 文件)。

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

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

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

如何优化内存使用使其不会崩溃?

4

1 回答 1

1

我解决了我的问题:

  • viewWillAppear:调用[super viewWillAppear:animated]. 我最初这样做是因为我有一个超类,它为我拥有的所有不同地图实例化公共元素,并且元素以正确的顺序出现。现在对 super 的调用是在其他任何事情之前完成的,我将元素放在前面。

  • 我现在将我的 webview 设置为 nil,然后再创建和推送另一个地图(因此另一个 webview 与其他内容)。

  • 第一个 webview 是由故事板创建的。现在一切都在代码中完成。

  • 地图的绘图已被简化,因此文件的大小更轻。(细节较少)

内存报告显示,已使用内存现在约为 81.9 Mb(第 5 代 iPod Touch 上可用内存的 16.2%)。

我发现奇怪的是,我有一个(相当)小的 svg 文件的内存压力警告。此外,量具显示的百分比从未高于 50%。我没有考虑 JS 引擎和 webview 内存限制。(据说 Javascript 引擎在 iOS 8 中获得了全部功能,如此处所报道。(我找不到任何有关内存限制的官方文档,可能是因为它似乎因设备而异。请参阅此答案。)

最后,在我的 iPhone 4s 或第 5 代 iPod Touch 上加载页面仍然很长,但它可以工作。如果您想提出更好的方法来实现这种地图,欢迎您这样做。

于 2014-06-26T15:32:29.363 回答