Memory leaks Xamarin.Forms 2.4.0及以上版本的nugget中的Xamarin.iOS是否不再使用参考计数法?

Memory leaks Xamarin.Forms 2.4.0及以上版本的nugget中的Xamarin.iOS是否不再使用参考计数法?,memory-leaks,xamarin.ios,xamarin.forms,garbage-collection,Memory Leaks,Xamarin.ios,Xamarin.forms,Garbage Collection,自XF 1.0以来,我一直在开发Xamarin。从XF 1.0到现在的XF 2.4,内存泄漏是一个巨大的问题。我一直在所有ContentPage和ViewModel类中实现Dispose模式,以确保每个类的OnDisappearing()或Dispose()函数中的事件处理程序、消息订阅者和对象引用都被删除并设置为null 这里有一些非常有趣的事情。在我将我的项目从2.3.3.180升级到Xamarin.Forms 2.4.0.280之后。我发现这种用于在Xamarin.iOS中创建内存泄漏的代

自XF 1.0以来,我一直在开发Xamarin。从XF 1.0到现在的XF 2.4,内存泄漏是一个巨大的问题。我一直在所有ContentPage和ViewModel类中实现Dispose模式,以确保每个类的OnDisappearing()或Dispose()函数中的事件处理程序、消息订阅者和对象引用都被删除并设置为null

这里有一些非常有趣的事情。在我将我的项目从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");
    }
}
public部分类联系人页面:ContentPage
{
公共联系人页面()
{
初始化组件();
}
出现时受保护的覆盖无效()
{
//假设我在Xaml页面中声明了名为“btn”的按钮
btn.单击+=打开按钮单击
MessagingCenter.Subscribe(此“AMessageType”,(发件人,参数)=>
{
//一些代码
});
}
受保护的覆盖无效OnDisappearing()
{
//点击按钮-=点击按钮
//取消订阅(此为“AMessageType”);
}
}
在Xamarin.Forms 2.4之前,如果我们以模式多次推送和弹出此页面,我们将看到此页面的多个实例保留在内存中,并且不会被垃圾收集,因为事件处理程序和订阅服务器未被删除,并且它们创建了指向ContactUsPage实例的对象引用,除非我们在OnDisappearing()函数中取消对代码的注释

在Xamarin.Forms 2.4.0.280中编译时,上述代码不再在Xamarin iOS中产生内存泄漏,尽管根据我对引用计数垃圾收集工作原理的了解,这显然是内存泄漏。Xamarin是否更改了Xamarin.iOS的GC方法?现在它正在像Xamarin.Android那样做标记和扫描

谁能告诉我什么改变了,为什么?
非常感谢

查看MessagingCenter的提交历史记录


我相信您正在看到2017年1月3日承诺的影响。至少就您上面使用MessagingCenter的示例而言。

在中找不到任何相关信息。这解释了为什么MessaginCenter订户是GC收集的,因为2017年1月3日的提交使其使用弱引用。但是像“btn.Clicked+=OnButtonClicked”这样的按钮事件处理程序如何而不删除事件处理程序?你知道任何Xamarin.表单提交会导致这种变化吗?谢谢