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承諾導致這種變化?謝謝。 –

相關問題