当释放在单触摸/ mvvmcross对象(when to release objects in mo

2019-07-19 05:27发布

我们正在实施似乎有重大的内存泄漏的应用程序。 举一个例子,我们有与在单探查注册的38倍corrosponding视图模型视图,但它应该是垃圾收集。 我们有很多的自定义控件等,但应该在哪里,这些被布置 - 所以我们应该在哪里做我们的清理工作于iOS 6 viewdidunload不叫了?

问候

Answer 1:

这是一个大问题......,不能轻易回答的一般情况。

在一般情况下,如果你写得真好简单的ViewModels和漂亮的简单的浏览,那么你不会得到任何内存泄漏。

但是,如果你有意见引用的ViewModels,这反过来又莫名其妙地引用次数回调,那么它很可能得到内存泄漏 - 特别是如果您的视图模型订阅上的服务活动。


一个特别糟的情况是,当ObjC和C#都具有对对象的引用。 有一个关于这方面的一些讨论http://forums.xamarin.com/discussion/97/correct-way-to-pop-a-dialogviewcontroller-mine-are-staying-in-memory其中还引用了我们曾经在一个问题在SQL位的例子- https://github.com/slodge/MvvmCross/issues/19

这可能不是你的漏电流的情况下,但它是值得一读Rolf的答案- http://forums.xamarin.com/discussion/comment/535/#Comment_535 -几次-它不是一个入门级的解释,但它是有道理的最终!


因此,为了解决当前的问题...

  1. 制定出什么是泄漏

  2. 明白为什么 - 它是什么,是抱着到引用。

  3. 修理它。

关键是在对错误的修正潜水前投入的精力体面的数额做的1和2的研究,为3.在试图“修复”没有真正知道什么“它”是没有意义的。

好消息是,单探查 - 用其内置的工具,以确定哪些有什么参考 - 是这份工作帮助非常好。

从你的描述,我知道你已经发现这个工具-但对于其他人阅读,请参阅- http://docs.xamarin.com/ios/Guides/Deployment%252c_Testing%252c_and_Metrics/Monotouch_Profiler


一旦你已经确定什么是泄漏,为什么,然后步骤3将需要一些思考,但有望容易回答。

有时候,解决的办法是:

  • 刚修好的代码一个坏行......这行是有点难。
  • 使用“后退”的检测,制定出何时断开绑定或事件。
  • 使用“willappear”,“willdisappear”添加生命周期事件改变你的订阅从事件/退订方式
  • 使用比C#事件的另一种方法-例如使用信使如TinyMessenger(或MvvmCross插件信使) -这些具有它们通常使用的优点WeakReference类,以避免泄漏。
  • 在处置“适当的时候”“东西” - 再次合作了“东西”和“适当的时间”在这个困难的部分

无论发生什么情况,不要慌张,做好从工程学的角度解决这个。 这些泄漏非MvvmCross和非MonoTouch的代码发生太大 - 使用MvvmCross用干净的IoC的架构应该让他们更容易找到并删除。


如果问题变成是在某处MvvmCross结合,那么,请不要登录它作为一个错误 - 我把这些问题非常重视!

还有在上MvvmCross回购关于我们是否应该使用我们所有的绑定代码在WeakReferences进行了长时间讨论一个开放的错误-见https://github.com/slodge/MvvmCross/issues/17 -我认为这样做这一点 - 它会帮助人们避免一些错误......但不是全部。 这个问题仍然是开放的。


更新 :我没有回答

我们有很多的自定义控件等,但应该在哪里,这些被布置

该框架应处置这些你。

如果没有的话那可能是因为别的事情被泄露,并持有到您的视图,然后抱着你的控制。 你需要解决这个潜在的问题,而不是在控制过早地调用Dispose()。 内存泄漏调试是不容易的,但是是一种乐趣(有时)



Answer 2:

一个很好的规则是,被添加到基于NSObject的类containees应该只参考使用WeakReference的对象的容器。

像这样:

 // MyView is a UIView, which is an NSObject, so the rule will apply here
 class MyView : UIView {
       WeakReference<UIViewController> myController;

       public MyView (RectangleF bounds, UIViewController myContainer) 
           : base (bounds) {
           this.myController = myContainer;
       }
 }


文章来源: when to release objects in mono touch / mvvmcross