我正在使用slroid提供的mvvmcross框架使用mono droid。但是我有一些内存问题。我在活动ondestroy方法中处理位图,我想知道是否有可能帮助GC收集viewmodels的未使用对象。如果你尝试将活动中的viewmodel设置为null,那么一切都会变成地狱,这显然不是正确的方法。
你们对方法有什么建议吗?
此致
答案 0 :(得分:1)
mvx框架尝试确保活动拥有viewmodel。
理论上,在你的活动被销毁之后,gc应该能够收集你所有的c#对象 - 活动,它拥有的视图,视图模型和它拥有的对象。
我已经看到这个出错的地方是任何'global'或singleton对象拥有对view或viewmodel对象的引用。例如:
如果一个视图用单例注册自己 - 例如一个http图像加载器 - 然后该单例保留对该视图的引用,防止它被垃圾回收。
如果一个视图模型订阅了一个中央服务上的事件(通常是一个单例)并且没有取消订阅 - 那么在这种情况下,视图模型不能被垃圾收集(通常这也会阻止其他正在收集的物品)
通常,这两种类型的错误都可以通过对活动销毁执行清理操作来解决。但是,也可以使用其他方法 - 例如,对于事件订阅,您可以尝试使用弱引用(这也是在其他平台上采用的方法 - 例如mvvm light的信使)
根据经验,泄漏最明显的区域是像图像一样的“大物体” - 它们的大小有助于它们变得明显。然而,monodroid的真正挑战是确定泄漏的位置 - 修复它们通常比较容易。
可悲的是,目前还没有可用于droid的内存分析器。如果您正在交叉编译为wp7,那么当然对于viewmodel对象/泄漏,您可以使用其内存分析器。如果没有,那么我通常尝试解决内存泄漏的方法是放大它们 - 尝试编写一个快速重现它们的样本 - 例如通过向数据元素添加大型byte []成员或快速重复操作。一旦您轻松复制了泄漏,那么您可以通过在终结器,事件删除处理程序等中放置跟踪语句来尝试查找泄漏。