Mono GC と ObjC 参照カウントがどのように共存しているかを理解することに近づいていると思います。
そのしくみは、ネイティブ オブジェクトの参照カウントが 1 の場合、マネージド インスタンスがガベージ コレクションされるのを妨げないということです。参照カウントが 1 を超えるとすぐに、マネージド インスタンスがガベージ コレクションされないようにします。
これは、管理対象オブジェクトにユーザー状態が含まれる場合があるためです。対応するネイティブ オブジェクト (マネージド UIView インスタンスなど) をミラーリングしているマネージド オブジェクトの場合、MonoTouch はインスタンスに状態を含めることができないことを認識しているため、マネージド コードがマネージド インスタンスへの参照を持たなくなるとすぐに、GC はそれを収集できます。後の段階でマネージド インスタンスが必要になった場合は、新しいインスタンスを作成するだけです。
したがって、CustomButton
を継承するを作成し、UIButton
それをサブビューとして に追加しView
、マネージド参照をスコープから外してから GC を実行すると、このマネージドは CustomButton
まだコレクションの対象になりません。
なぜ収集できないのですか?もちろん、プロパティのような管理された状態を持っているかもしれませんが、管理されたオブジェクトからのリンクがなければ、誰がこの状態を気にするでしょうか? 消えるだけかもしれませんが、なぜ消えないのでしょうか?
考えられる理由の 1 つを考えています。CustomButton
イベントをサブスクライブしても GC が存続しないため、オブジェクトが収集されると、イベントの発生が停止します。これにより、予期しない動作が発生する可能性があります。
これは正しいです?誰もリンクしていない場合でも、管理対象オブジェクトを存続させる他の理由はありますか?