私は理解に近づいていると思いますhow Mono GC and ObjC ref counting live together。MonoTouch GCがrefcount> 1の管理対象オブジェクトを強制終了できないのはなぜですか?
ネイティブオブジェクトの参照カウントが1の場合、管理対象インスタンスがガベージコレクションされることを防ぐことはできません。 参照カウントが1以上になると、マネージインスタンスがガベージコレクションされなくなります。
これは、管理対象オブジェクトにユーザー状態が含まれている可能性があるためです。対応するネイティブオブジェクト(マネージUIViewインスタンスなど)をミラーリングしているマネージオブジェクトの場合、MonoTouchはそのインスタンスに状態が含まれていないことを認識しています。マネージコードがマネージインスタンスへの参照を持たないと、GCは収集します。後で管理対象インスタンスが必要な場合は、新しいインスタンスを作成するだけです。
私はスコープの外管理リファレンススリップを聞かせて、その後、GCを実行し、私のView
にサブビューとして追加、UIButton
を継承CustomButton
を作成するのであれば、このはCustomButton
はまだコレクションの対象にはなりません管理。
なぜ収集できないのですか?もちろん、プロパティのような管理された状態のがあるかもしれませんが、管理対象オブジェクトからのリンクがない場合、この状態を気にする人はですか?それはちょうど消えるかもしれません、なぜそれはできませんか?
私は1つの考えられる理由を考えています:CustomButton
のイベントを購読すると、GCのためにそのイベントが維持されないので、オブジェクトが収集されるとイベントが発生しなくなります。これは予期せぬ動作を引き起こします。
これは間違いありませんか?誰もそれをリンクしていなくても、管理オブジェクトを生きたままにする理由はありますか?
私はついにそれを手に入れました。ここでのあなたのサポートは欠かせません。 –
私はあなたの2つの質問とRolfのすばらしい答えが好きです。ちょうど新しいことを学んだ:-) –
私はこれを抱いて遊んできました。 myView変数がusingブロック内に作成された場合はどうなりますか?計測器ツールは、インスタンスが解放されることを示します。それは非常に扱いにくいと感じますが、私はコードの振る舞いにおいてアイデンティティと問題はできません。思考? @rolf –