私はXF 1.0からXamarinを開発しています。メモリリークは、XF 1.0からXF 2.4までの大きな問題でした。私は常にイベントハンドラ、メッセージサブスクライバ、オブジェクト参照がすべて削除され、各クラスのOnDisappearing()またはDispose()関数のいずれかでnullに設定されるように、すべてのContentPageクラスとViewModelクラスにDispose Patternを実装しています。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に、我々はこのページの複数のインスタンスがメモリに固執し、ゴミがのために収集されることはありませんが表示されますイベントハンドラとサブスクライバは削除されず、OnDisappearing()関数でコードのコメントを解除しない限り、ContactUsPageインスタンスを指すオブジェクト参照を作成しました。
上記のコードは、Xamarin.Forms 2.4.0.280でコンパイルしたときにXamarin iOSでメモリリークが発生することはなくなりましたが、リファレンスカウントガベージコレクションの仕組みに関する私の知識によれば明らかにメモリがリークしています。 Xamarinは、Xamarin.iOSのGCメソッドを変更しましたか?だから今はXamarin.Androidのようなマークアンドスイープをしていますか?
変更された理由とその理由を教えてもらえますか? ありがとう!
[Xamarin.forms 2.4リリースノート](https://developer.xamarin.com/releases/xamarin-forms/xamarin-forms-2.4/2.4.0-stable/)には何も見つかりませんでした。 。 –