适用于iOS的Air - 如何处理因内存有限而导致的崩溃?

Mat*_*Mat 2 air exception out-of-memory actionscript-3 ios

我们目前正在使用Air for iOS开发iPad应用程序,并且不时遇到崩溃(仅在iPad1上使用ios 5),这似乎是因为应用程序占用了太多内存.

如何在应用程序中捕获/处理此类错误?如何在内存不足时收到通知?试图捕捉flash.errors.MemoryError似乎不起作用.有小费吗?

J. *_*mes 5

我已经在这方面做了一些工作,这里有一些我可以给你的提示.

  1. 获取Flash Builder 4.6 Premium.

    如果仅针对探查器,请获取它.它有一个最好的分析器可用于诊断这样的事情.话虽如此,周围还有其他Flash分析器,它们具有不同程度的实用性.

    仅这一点就可以帮助您找到并诊断大部分内存在原始内存使用方面的位置,还可以帮助您找到正在创建和销毁的对象数量以及它们在垃圾收集器最终到来之前闲置了多长时间让他们离开.

  2. 池较小的琐碎物体

    而不是不断地创建和破坏较小的对象,而是创建对象池.这将节省您不断旋转新对象的成本,并使您不必等到垃圾收集器在释放内存之前运行.

    在actionscript中创建对象池时需要考虑很多示例和模式.如果AS支持泛型会更容易,但即使没有它们,它仍然非常直接.

  3. 急切地处理巨大的物体

    这与前一点的建议直接相反,但对于大型对象,您不希望它们永远存在于内存中.我指的是这样的事情BitmapData,当你完成它们(在可预见的将来)时,将它们拆掉并将它们清空,然后让垃圾收集器将其清理干净.

    当您再次需要它们时,重建它们.是的,你会受到轻微的性能影响,但移动设备上的内存是宝贵的,不要浪费它,只要保留一个2mbbit的bitmapdata对象,它只出现在加载屏幕上.把它扔掉.

  4. 删除你不再需要的引用

    花些时间尝试真正了解垃圾收集器需要做什么工作,以及它如何决定哪些对象可以被丢弃和不被丢弃.尽量避免自引用对象/循环引用,而CG通常可以解决它,有时它可能需要一个litle手持.

  5. 每次使用时评估new [与2相关]

    再次使用内存分析器将有助于此步骤,但请确保每次实例化新对象时,都需要实例化一个新对象.在为PC开发时可能很容易变得懒惰,只是将新对象扔进池中并让CG对其进行排序.如果它很小,请查看是否有良好的缓存策略(对象池或仅引用缓存).如果它是一个巨大的物体,你经常建立和拆除,可能是时候尝试提出一个更好的架构解决方案.

据我所知,如果你认为iOS认为内存不足,那已经太晚了.上次我检查时,框架会在认为内存耗尽时尝试运行CG,如果它无法释放足够的内存来继续运行,则会失败.尽力避免达到操作系统认为唯一安全选项终止线程的程度.

  • 不是真的 - 在为iOS编码时,您仍然可以释放一些内存并至少显示一条错误消息(而不是让应用程序崩溃).System.freeMemory似乎没有帮助,因为它总是一个非常小的数字,独立于应用程序目前使用的内存量.此外,崩溃似乎取决于后台运行的其他应用程序数量.当然,保持较低的内存消耗是好的,但最好至少有一种方法来了解应用程序崩溃的原因(至少将内存不足写入日志文件或类似的东西) (2认同)