【问题标题】:Rendering svg in uiwebview causes memory pressure (and app crash)在 uiwebview 中渲染 svg 会导致内存压力(和应用程序崩溃)
【发布时间】:2014-05-11 10:23:57
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: ios svg uiwebview instruments memory-pressure


    【解决方案1】:

    我解决了我的问题:

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

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

    • 第一个 Web 视图是由情节提要创建的。现在全部在代码中完成。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-20
      • 2014-03-30
      • 1970-01-01
      • 2011-07-08
      • 2012-09-22
      相关资源
      最近更新 更多