1

自XF 1.0以来,我一直在开发Xamarin。从XF 1.0到现在的XF 2.4,内存泄漏是一个巨大的问题。我一直在所有ContentPage和ViewModel类中实现Dispose模式,以确保Event Handler,Message Subscribers,对象引用全部被删除,并在每个类的OnDisappearing()或Dispose()函数中设置为null。Xamarin.Forms 2.4.0及以上版块中的Xamarin.iOS不再使用引用计数方法吗?

这是一件非常有趣的事情。在将我的项目从2.3.3.180升级到Xamarin.Forms 2.4.0.280之后。我发现这种类型的代码用于在Xamarin.iOS中创建内存泄漏不再发生。 代码示例:

public partial class ContactUsPage : ContentPage 
{ 
    public ContactUsPage() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnAppearing() 
    { 
     //Lets say I have button named "btn" declared in Xaml page 
     btn.Clicked += OnButtonClicked 

     MessagingCenter.Subscribe<CoreMessenger, string>(this, "AMessageType", (sender, arg) => 
     { 
      //some code 
     }); 
    } 

    protected override void OnDisappearing() 
    { 
     //btn.Clicked -= OnButtonClicked 
     //MessagingCenter.Unsubscribe<CoreMessenger, string>(this, "AMessageType"); 
    } 
} 

此前Xamarin.Forms 2.4,如果我们push和pop此产品的模态多时间里,我们会看到这个页面的多个实例坚持记忆,绝不会因被垃圾收集除非我们取消注释OnDisappearing()函数中的代码,否则不会删除事件处理程序和订阅服务器,并且它们会创建指向ContactUsPage实例的对象引用。

上面的代码不再在Xamarin iOS中编译时产生内存泄漏,当在Xamarin.Forms 2.4.0.280中编译时,虽然根据我对如何引用计数垃圾收集工作的知识,它显然正在泄漏内存。 Xamarin是否改变了Xamarin.iOS的GC方法?所以它正在像Xamarin那样标记和扫描.Android现在呢?

谁能告诉我是什么改变了,为什么? 谢谢!

+0

没有找到关于它的[Xamarin.forms 2.4发行说明]什么(https://developer.xamarin.com/releases/xamarin-forms/xamarin-forms-2.4/2.4.0-stable/) 。 –

回答

1

看一看提交历史记录MessagingCenter。

https://github.com/xamarin/Xamarin.Forms/commits/master/Xamarin.Forms.Core/MessagingCenter.cs

我相信你所看到的,至少在你上面的例子使用MessagingCenter方面的提交时间Jan 04,2017年的影响。

+0

这解释了为什么自MessaginCenter订阅者在2017年1月3日提交后收集GC使其使用弱引用。但是如果没有删除事件处理程序,按钮事件处理程序如“btn.Clicked + = OnButtonClicked”怎么样?你知道任何Xamarin.Forms承诺导致这种变化?谢谢。 –

相关问题