5

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

NSObject.mm (によって呼び出される関数のよう_objc_rootAllocWithZoneです)でもobjc-runtime-new.mm (それによって後で呼び出されます)。[NSObject alloc]_class_createInstanceFromZone_objc_rootAllocWithZone

4

1 に答える 1

10

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

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

于 2013-02-15T23:46:06.393 に答える