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