Mark ProbstとRodrigo KumperaのAdvanced Memory Managementを見て、私はMono GCをプロファイリングし、WeakReference
を使うなどの新しい技術を学びました。ラムダイベントハンドラに起因するGCサイクルを修正するにはどうすればよいですか?
しかし、私はまだ28分からのパズル2「を修正」する方法を理解していない:
public class CustomButton : UIButton {
public CustomButton() { }
}
public class Puzzle2Controller : UIViewController
{
public override void ViewDidLoad()
{
var button = new CustomButton();
View.Add (button);
button.TouchUpInside += (sender, e) =>
this.RemoveFromParentViewController();
}
}
コントローラはへのREFを保持しているイベントハンドラに参照を保持しているボタンに参照を保持していますコントローラ。
サイクルを中断する1つの方法は、ボタンを無効にすることです。 もう1つの方法は、ハンドラをデタッチすることです(ただし、lamdasを使用しないでください)。
他の/よりエレガントな/サイクルを壊す方法はありますか?どういうわけかWeakReference
をここに貼り付けることはできますか?
ありがとうございました。
編集:この場合、ボタンはフィールドでもありません。しかし、まだサイクルはありますか?それはコントローラのビューのサブビューにあります。私たちはそれらをクリアする必要がありますか?よくわかりません。
こんにちは、返信いただきありがとうございます。これは確かにオプションですが、残念ながら 'UIView'はコントローラを参照していません。私の理解が正しいならば、MonoTouch *のサイクルは問題になります。なぜなら、ネイティブのObjCオブジェクトは参照カウントを使用するからです。 (21:30を参照してください) –
@ DanAbramovこの場合、編集 –
ありがとう!これは完全に理にかなっています。 –