私がこれを行うと考えることができる唯一の方法は、オブジェクトのサブクラスを作成し、カウンターをインクリメント/デクリメントする保持/解放メソッドを追加し、このカウンターにオブザーバーを持ち、呼び出し後にオブジェクトサブクラスにもあるデコンストラクターを呼び出すことですネイティブ呼び出しを使用してメモリを解放するデコンストラクタ。
問題は、すべてのオブジェクトがこの新しいサブクラスを拡張しなければならず、後方互換性があまりないということです。これを行うためのより良い方法を考えられますか?
私がこれを行うと考えることができる唯一の方法は、オブジェクトのサブクラスを作成し、カウンターをインクリメント/デクリメントする保持/解放メソッドを追加し、このカウンターにオブザーバーを持ち、呼び出し後にオブジェクトサブクラスにもあるデコンストラクターを呼び出すことですネイティブ呼び出しを使用してメモリを解放するデコンストラクタ。
問題は、すべてのオブジェクトがこの新しいサブクラスを拡張しなければならず、後方互換性があまりないということです。これを行うためのより良い方法を考えられますか?
(ARC ではなく) Objective-C を模倣している場合、オブジェクトはそれが参照するものを追跡する必要がないことに注意してください。むしろ、プログラマーはそれを追跡し、必要に応じて「手動で」保持/解放します。リンクされているオブジェクトの追跡を自動化する必要はありません。
これを真似するために本当に必要なのは、メソッドをサポートし、参照カウントへのオブジェクト ポインターのマップを内部的に管理する (咳) シングルトンretain(Object)
ですrelease(Object)
。マップ内のオブジェクト ポインターは、カウントがゼロになるまで (マップ エントリが削除されるとき)、オブジェクトが存在することを保証します。カウントが 0 になった後、Map エントリを削除する前に、オブジェクトのdealloc
メソッドを呼び出すことができます (存在する場合は、Dealloc インターフェイスを実装しているかどうかをテストします)。
(しかし、これは基本的にSomeGuyの提案と同じだと思います。)