0

我正在使用 slodge 提供的 mvvmcross 框架使用单声道机器人。但是我有一些记忆问题。我在 ondestroy 方法的活动中处理位图,我想知道是否可以帮助 GC 收集未使用的视图模型对象。如果您尝试将 Activity 中的视图模型设置为 null,那么一切都会变得糟糕,这显然不是正确的方法。

你们对方法有什么建议吗?

问候

4

1 回答 1

1

mvx 框架试图确保活动拥有视图模型。

所以理论上,在你的activity被销毁之后,gc应该能够收集你所有的c#对象——activity、它拥有的视图、视图模型和它拥有的对象。

我看到这个出错的地方是任何“全局”或单例对象都拥有对视图或视图模型对象的引用。例如:

  • 如果一个视图用一个单例注册自己——例如一个http图像加载器——然后那个单例保持对视图的引用,防止它被垃圾收集。

  • 如果视图模型订阅了中央服务(通常是单例)上的事件并且没有取消订阅 - 那么在这种情况下,视图模型不能被垃圾收集(并且通常这也会阻止其他对象被收集)

通常,这两种类型的错误都可以通过对活动销毁执行清理操作来解决。但是,也可以使用其他方法 - 例如,对于事件订阅,您可以尝试使用弱引用(这也是在其他平台上采用的方法 - 例如 mvvm light 的信使)

根据经验,泄漏最明显的区域是围绕“大物体”(如图像)——它们的大小有助于它们变得引人注目。然而,monodroid 的真正挑战是确定泄漏的位置——修复它们通常相对容易。

遗憾的是,目前没有可用于 droid 的内存分析器。如果您要交叉编译到 wp7,那么对于视图模型对象/泄漏,您当然可以使用它的内存分析器。如果不是,那么我通常尝试解决内存泄漏的方法是放大它们 - 尝试编写一个快速重现它们的示例 - 例如通过向数据元素添加大字节 [] 成员或通过快速重复操作。一旦泄漏很容易重现,那么您可以尝试通过在终结器、事件删除处理程序等中放置跟踪语句来查找泄漏。

于 2012-09-25T07:18:36.167 回答