响应didReceiveMemoryWarning奇怪

时间:2010-08-22 23:50:28

标签: iphone mkmapview didreceivememorywarning

所以我有一张覆盖着MKPolygonViews堆的地图。当我把一对夫妇放在它上面时,如果我将它们全部放在系统上,则将一个didReceiveMemoryWarning发送到我通过删除叠加层来响应的系统。

现在我想知道在发生这种情况时它实际使用了多少内存,它只有10MB实内存和100MB虚拟内存。当时的SMS应用程序使用30MB的内存并且运行正常。还有其他应用程序,如使用超过我的应用程序的邮件。 SpringBoard上升5MB,所以没什么特别的。这也在iPhone 4上运行,因此应该有足够的内存(我的计算大约仍然是256MB)。

删除覆盖后,内存占用量仅下降约1MB,当我将其重新打开时,它会上升1MB,因此没什么异常。

那是怎么回事?内存警告是否来自图形内存或其他东西?这些叠加的性能是否受到图形处理器的限制?随着它们全部打开,它在移动时确实使用了大约60%,但这并不能解释糟糕的性能。

对此答案的任何指示都将不胜感激。

编辑:Springboard虚拟内存上升到450MB,打开覆盖层,一旦达到512MB,就会发出内存警告。这是什么引起了这个问题?总VM总是高于512MB,因此必须使用VM的闪存存储,因此不应引起内存警告

3 个答案:

答案 0 :(得分:1)

解决方案是将所有MKPolygonViews合并为一个MKpolygonView。更多详细信息可以在here

找到

答案 1 :(得分:0)

您应该通过仅显示当前地图上实际可见的叠加视图来优化该代码。为用户不看的地图区域添加叠加视图是没有意义的。

答案 2 :(得分:0)

我注意到的一件事是,仅仅从mapview中删除叠加层(如mkpolygon)是不够的。至少有两件事没有发生......

  1. 它没有释放所有内存
  2. 从地图视图中完全清除叠加层
  3. 这会导致许多问题,特别是如果您可能使用多个大型叠加层。我做了一些事情来抵消这一点。

    1. 我无法按照AppleDevForum帖子的建议将它们全部塞进一个MKPolygonView或“MultiPolygonView”,因为我的目标是iOS 3.2,它排除了这些“仅限iOS 4”类的子类...你仍然可以使用它们在3.2中,只是不是它们的子类
    2. 决定由于我的多边形中的坐标数量非常多,我将屏幕上的数字随时限制为两个。事实恰恰相反,对于我的应用来说,这是一个恰当的期望。因此,我将两个多边形视图存储为我的地图视图控制器的属性,并根据需要重复使用它们。
    3. 每当我需要释放内存(通常!)或需要更改多边形时,我首先通过调用[polygonView invalidatePath]使相应的多边形视图路径无效。只有在那之后我才重置polygonview属性,然后从地图视图中删除叠加层(如有必要,在重新创建之前)。
    4. 这是我能够设法更改屏幕上多边形覆盖的唯一方法,干净地清除旧多边形,并强制释放内存。

      如果有更好,更有效的方法来做所有这些,我当然愿意接受建议!