この研究により、CoreFoundation オブジェクトの内部が理解できることを願っています。以下は、無料の Quartz プロジェクトの CGColor の構造です。
typedef struct CGColor {
CFRuntimeBase obj;
CFTypeID nextID;
CGColorSpaceRef colorSpace;
CGPatternRef pattern;
size_t numberOfComponents;
CGFloat *components;
} *CGColorRef;
CGColor オブジェクトが作成され、nextID メンバーに割り当てられるたびに増分されるグローバル スレッド セーフの一意の値が保持されます。ドキュメントに記載されていない CGColorGetIdentifier() 関数のみがこの値を返します。
CoreGraphics とそのリソース ライブラリを確認しました。ripc_GetColor (libRIP.A.dylib) 関数のみが CGColorGetIdentifier() 関数を呼び出し、いくつかの色ペアの nextID 値を比較しているようです。
CGColorGetIdentifier; のコール スタック (nextID に関する推測に役立つことを期待して)
0 com.apple.CoreGraphics CGColorGetIdentifier + 0 1 libRIP.A.dylib ripc_GetColor + 112 2 libRIP.A.dylib ripc_DrawGlyphs + 1740 3 com.apple.CoreGraphics CGContextDelegateDrawGlyphs + 108 4 com.apple.CoreGraphics drawGlyphs + 284 5 com.apple.CoreGraphics CGContextShowGlyphsWithAdvances + 208
CFEqual は最初に参照を比較し、それらが等しくない場合はコンテンツを比較するため、参照を比較することは正しいアプローチです。参照が変更されない場合、一意の ID 値を作成して維持するのはもったいないでしょう。
したがって、一意の ID の可能な要件と、それらを比較してオブジェクトが等しいかどうか。
- スレッドの安全性に関する懸念がある場合は、参照を比較するよりも ID を比較することをお勧めします。ポイントを参照するコンテンツ(データ)は、参照を取得した直後に(別のスレッドによって)変更される可能性があります。
- または、後で使用するために保存された参照が、同じスレッド内であっても、他の予期しないアクションによって解放および/または変更されます。
したがって、コンテンツに関する参照のようなものを使用して、常に使用できるようにすることができます (メモリが解放されると参照が無効になる可能性があります)。また、コンテンツ全体ではなく、ID などの一部のデータを使用すると、パフォーマンスが最適化されます。
Apple の Core Graphics の CGColor にあるこの nextID の本当の意図は何ですか? 以前のアプローチから残っているので、完全に放棄することはできませんでしたか?