我希望通过这项研究了解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并将它们与对象相等进行比较;
因此,我们可以使用类似于内容的引用,并确保它们可以一直使用(当释放内存时refs可能变得无效)。此外,当使用ID等数据而不是整个内容时,性能将得到优化。
在Apple的Core Graphics的CGColor中,这个nextID的真正意图是什么?是否遗留了以前的方法,所以不能完全放弃?
答案 0 :(得分:0)
id说nextID字段有点像内容摘要。它识别对象的相同内容 - 在本例中为colors。
等于的对象,必须与我们都知道的具有相同的引用。即使它们包含EQUAL数据并且实际上是相等的,例如黑色RGB或黑色BW ...两者都是BLACK:D(只是一个例子!) - 因此你需要比较它们的内容。
对于数字或日期左右你可以找到...它们被称为标记数字和标记日期。