2013-02-15 15 views
5

私の質問は、Foundationの現在のバージョン(またはObjective-Cランタイムライブラリは、そこにあるようだから)NSObject派生オブジェクトの保持カウントを実装する方法ですか?私がNSObject.mmに見ることができたように、NSObjectのインタフェース本体にretain countという象牙はありません。代わりに、各オブジェクトの参照カウンターを含む一種のテーブルまたはマップがあるようです。しかし、保持カウントが実際にマップで行われている場合は、retainreleaseの操作がこの種の実装で高価すぎるのではない(この場合、ミューテックスをロックしたりアンロックしたり、マップを参照して適切なオブジェクトを見つける必要があるマルチスレッド環境では、一度に1つのオブジェクトしか保持/解放できないという事実)保持カウントはNSObjectでどのように実装されていますか?

私はそれが取得する(objc-runtime-new.mmで、どちらもNSObject.mm_objc_rootAllocWithZone中([NSObject alloc]によって呼び出される関数であると思われる)も_class_createInstanceFromZoneに新しいオブジェクトを割り当てるときに1に維持するカウンタを設定するに関連する何かを見つけることができませんでした後に_objc_rootAllocWithZoneと呼ばれる)。

+2

- (NSUInteger)retainCount {return rand()}; – CodaFi

+0

ああああ、私は終わりを間違ってしまった; ...私は今夜寝ることはありません。 – CodaFi

答えて

10

NSObjectの保持カウントは実際にグローバルマップに保持されています。 IIRCでは実際にオブジェクトのアドレスに基づいて分割されたマップセットを使用してロック競合を減らしていますが、実際の実装の詳細は実装の詳細です。

いずれの場合も、保持カウントが1に設定されているコードを見つけることができません。保持カウントが1のオブジェクトはマップに入れられません。オブジェクトは、最初の1を過ぎてretainになったときに保持カウントマップにのみ入力されます。これは、保持カウントが1を超えないオブジェクトの一般的なケースを高速化する最適化です。

+1

...保持カウントをまったく持たないタグ付きポインタの特別な場合です。データ自体はポインタ内でコード化されているため、技術的には参照ではなく値で渡します(参照は値であり、参照の後ろには何もないため)。 – Tommy

+0

真。もちろん、 '-retain'や' -release'を上書きするクラスであれば、保持カウントを独自に実装することは自由です。保持カウントをivarとして埋め込むいくつかのクラスがあります。なぜなら、より大きなオブジェクトを持つことを犠牲にして 'retain'と' release'をスピードアップする方が好きだからです。 –

+0

しかし、なぜ彼らは保持/解放のコストを削減するカウンターとしてivarを使用しないのですか?地図を使用する特別な理由があるかどうか知っていますか? – LuisABOL

関連する問題