2

この研究により、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 の可能な要件と、それらを比較してオブジェクトが等しいかどうか。

  1. スレッドの安全性に関する懸念がある場合は、参照を比較するよりも ID を比較することをお勧めします。ポイントを参照するコンテンツ(データ)は、参照を取得した直後に(別のスレッドによって)変更される可能性があります。
  2. または、後で使用するために保存された参照が、同じスレッド内であっても、他の予期しないアクションによって解放および/または変更されます。

したがって、コンテンツに関する参照のようなものを使用して、常に使用できるようにすることができます (メモリが解放されると参照が無効になる可能性があります)。また、コンテンツ全体ではなく、ID などの一部のデータを使用すると、パフォーマンスが最適化されます。

Apple の Core Graphics の CGColor にあるこの nextID の本当の意図は何ですか? 以前のアプローチから残っているので、完全に放棄することはできませんでしたか?

4

1 に答える 1

0

id によると、nextID フィールドはコンテンツの要約のように機能します。オブジェクトの等しいコンテンツを識別します。この場合は色です。

等しいオブジェクトは、私たちが知っているように、同じ参照を持つべきではありません。それらに EQUAL データが含まれていて、実際に等しい場合でも..たとえば、RGB の黒または BW の黒.... 両方とも黒です:D (単なる例です!) - したがって、それらの内容を比較する必要があります。

数字や日付などについては、タグ付き番号とタグ付き日付と呼ばれます。

于 2013-02-17T00:43:56.323 に答える