Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory management 何时在mono touch/mvvmcross中释放对象_Memory Management_Xamarin.ios_Mvvmcross - Fatal编程技术网

Memory management 何时在mono touch/mvvmcross中释放对象

Memory management 何时在mono touch/mvvmcross中释放对象,memory-management,xamarin.ios,mvvmcross,Memory Management,Xamarin.ios,Mvvmcross,我们正在实施一个应用程序,它似乎有严重的内存泄漏。例如,我们有一个视图及其相应的viewmodel,它在mono profiler中注册了38次,但应该进行垃圾收集。我们有很多自定义控件等,但这些控件应该放在哪里呢?因为ios 6不再调用viewdidunload,所以我们应该在哪里进行清理 这是一个大问题。。。一般情况下很难回答 通常,如果您编写了漂亮的简单视图模型和漂亮的简单视图,那么您将不会得到任何内存泄漏 但是,如果您的视图引用了ViewModels,而ViewModels又有以某种方式

我们正在实施一个应用程序,它似乎有严重的内存泄漏。例如,我们有一个视图及其相应的viewmodel,它在mono profiler中注册了38次,但应该进行垃圾收集。我们有很多自定义控件等,但这些控件应该放在哪里呢?因为ios 6不再调用viewdidunload,所以我们应该在哪里进行清理


这是一个大问题。。。一般情况下很难回答

通常,如果您编写了漂亮的简单视图模型和漂亮的简单视图,那么您将不会得到任何内存泄漏

但是,如果您的视图引用了ViewModels,而ViewModels又有以某种方式引用视图的回调,那么很可能会发生内存泄漏,特别是如果您的视图模型订阅了服务上的事件


一个特别糟糕的情况是,ObjC和C#都有对象的引用。这里有一些关于这个的讨论,其中也提到了我们曾经在SQL bits示例中遇到的一个问题-

这可能不是你目前泄漏的情况,但值得阅读Rolf的答案——几次——这不是入门级的解释,但最终还是有意义的


所以,为了解决你目前的问题

  • 找出漏水的地方

  • 找出原因——是什么东西在保留这些参考资料

  • 修好它

  • 关键是在研究1和2时投入相当大的精力,然后再研究3的错误修复。在不知道“它”是什么的情况下试图“修复它”是没有意义的

    好消息是,Mono profiler(内置工具,用于识别哪些内容引用了哪些内容)非常有助于完成这项工作

    从你的描述中,我知道你已经找到了这个工具-但是对于其他正在阅读的人,请参阅-


    一旦您确定了泄漏的内容和原因,那么第3步将需要一些思考,但希望很容易回答

    有时,解决办法是:

    • 只需修复一行错误的代码。。。哪一行是最难的
    • 使用“返回”检测,确定何时断开绑定或事件
    • 使用“将出现”、“将消失”添加生命周期事件,以更改订阅/取消订阅事件的方式
    • 使用C#events以外的替代方法-例如使用TinyMessenger(或MvvmCross插件Messenger)等Messenger-这些方法的优点是它们通常使用
      WeakReference
      类来避免泄漏
    • 在“适当的时间”处理“某物”-再次指出,确定“某物”和“适当的时间”是本课程的难点
    不管发生什么,不要惊慌,从工程的角度解决这个问题。这些泄漏也发生在非MvvmCross和非MonoTouch代码中——使用MvvmCross和干净的IoC架构应该使它们更容易查找和删除


    如果问题确实出现在某个地方的MvvmCross绑定中,那么请将其记录为错误-我非常认真地对待这些问题

    在关于MvvmCross repo的长时间讨论中,关于我们是否不应该在所有绑定代码中使用WeakReferences,仍然存在一个开放的bug-请看-我已经考虑过这样做-它将帮助人们避免一些bug。。。但并非全部。这个问题仍然悬而未决


    更新:我没有回答

    我们有很多自定义控件等,但是这些控件应该放在哪里呢

    框架应该为您处理这些


    如果没有,那很可能是因为其他东西正在泄漏,并保留了您的视图,而视图又保留了您的控件。您需要修复这个潜在的问题,而不是过早地对控件调用Dispose()。内存泄漏调试并不容易,但有点有趣(有时)

    一条好规则是,添加到基于NSObject类的容器只应引用使用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;
           }
     }
    
    //MyView是一个UIView,它是一个NSObject,因此规则将在这里应用
    类MyView:UIView{
    WeakReference-myController;
    公共MyView(矩形边界,UIViewController myContainer)
    :基本(边界){
    this.myController=myContainer;
    }
    }