CGColorRef opaque类型的对象的ID

时间:2013-02-08 23:38:30

标签: ios core-foundation opaque-pointers

我希望通过这项研究了解CoreFoundation对象的内部结构。 下面给出了free quartz project.

中CGColor的结构
typedef struct CGColor {
        CFRuntimeBase obj;

        CFTypeID nextID;
        CGColorSpaceRef colorSpace;
        CGPatternRef pattern;
        size_t numberOfComponents;
        CGFloat *components;
} *CGColorRef;

保持全局线程安全唯一值,对于创建并分配给nextID成员的每个CGColor对象,该值都会增加。只有未记录的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. 或者存储以供进一步使用的引用即使在同一个帖子中也会被其他一些无法预料的行为发布和/或修改。
  3. 因此,我们可以使用类似于内容的引用,并确保它们可以一直使用(当释放内存时refs可能变得无效)。此外,当使用ID等数据而不是整个内容时,性能将得到优化。

    在Apple的Core Graphics的CGColor中,这个nextID的真正意图是什么?是否遗留了以前的方法,所以不能完全放弃?

1 个答案:

答案 0 :(得分:0)

id说nextID字段有点像内容摘要。它识别对象的相同内容 - 在本例中为colors。

等于的对象,必须与我们都知道的具有相同的引用。即使它们包含EQUAL数据并且实际上是相等的,例如黑色RGB或黑色BW ...两者都是BLACK:D(只是一个例子!) - 因此你需要比较它们的内容。

对于数字或日期左右你可以找到...它们被称为标记数字和标记日期。