1

私は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のようなマークアンドスイープをしていますか?

変更された理由とその理由を教えてもらえますか? ありがとう!

+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を使用して上記のあなたの例の観点から1月3日、2017年にコミットの効果を見ていると信じています。

+0

これは、2017年1月3日のコミットで弱参照を使用したため、MessaginCenterサブスクライバがGC収集された理由を説明しています。しかし、イベントハンドラを削除せずに "btn.Clicked + = OnButtonClicked"のようなボタンイベントハンドラはどうでしょうか? Xamarin.Formsのコミットがこの変更につながることは知っていますか?ありがとう。 –

関連する問題