我们目前正在使用适用于 iOS 的 Air 开发 iPad 应用程序,但有时会遇到崩溃(仅在带有 ios 5 的 iPad1 上),这似乎是因为该应用程序占用了太多内存。
如何在应用程序中捕获/处理此类错误?内存不足时如何通知?试图捕捉 flash.errors.MemoryError 似乎不起作用。有小费吗?
我们目前正在使用适用于 iOS 的 Air 开发 iPad 应用程序,但有时会遇到崩溃(仅在带有 ios 5 的 iPad1 上),这似乎是因为该应用程序占用了太多内存。
如何在应用程序中捕获/处理此类错误?内存不足时如何通知?试图捕捉 flash.errors.MemoryError 似乎不起作用。有小费吗?
我在这方面做了一些工作,这里有一些我可以给你的提示。
获取 Flash Builder 4.6高级版。
如果仅针对探查器,请获取它。它具有可用于诊断此类问题的最佳分析器之一。话虽如此,周围还有其他 Flash 分析器,它们具有不同程度的有用性。
仅此一项就可以帮助您查找和诊断大部分内存在原始内存使用方面的去向,还可以帮助您找到正在创建和销毁的对象的数量以及在垃圾收集器最终运行之前它们停留了多长时间让他们走。
池更小的琐碎对象
与其不断地创建和销毁较小的对象,不如创建对象池。这将为您节省不断旋转新对象的成本,并使您不必等到垃圾收集器运行后再释放内存。
在 actionscript 中创建对象池有很多示例和模式可供参考。如果 AS 支持泛型会更容易,但即使没有它们,它仍然非常简单。
急切地处理巨大的物体
这与上一点的建议直接背道而驰,但是对于大型对象,您不希望它们永远在内存中徘徊。我指的是这样的事情BitmapData
,当你用完它们(在可预见的将来),把它们拆掉并把它们清空,然后让垃圾收集器清理它。
当你再次需要它们时,重建它们。是的,你会受到轻微的性能影响,但移动设备上的内存是宝贵的,不要浪费它,保留一个只出现在加载屏幕上的 2mb 位图数据对象。把它扔掉。
取消您不再需要的引用
花点时间尝试真正了解垃圾收集器需要做什么,以及它如何决定哪些对象可以丢弃,哪些不能丢弃。尽量避免自引用对象/循环引用,虽然 CG 通常可以弄清楚,但有时可能需要一个小手握住。
每次使用时评估new
[相关2]
再次使用内存分析器将有助于这一步,但要确保每次实例化一个新对象时,都需要实例化一个新对象。在为 PC 开发时很容易变得懒惰,只是将新对象扔到池中并让 CG 整理出来。看看是否有好的缓存策略(对象池,或者只是引用缓存)如果它很小。如果它是一个你经常建造和拆除的巨大物体,那么可能是时候尝试提出一个更好的架构解决方案了。
据我所知,如果你到了 iOS 认为内存不足的地步,那就太迟了。上次我检查时,框架会在认为内存不足时尝试运行 CG,如果无法释放足够的内存继续运行,则会失败。尽你最大的努力避免达到操作系统认为唯一安全的选择是终止你的线程的地步。