我希望通过这项研究了解 CoreFoundation 对象的内部结构。下面给出了来自免费石英项目的 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 并比较它们是否相等;
- 当存在线程安全问题时,比较 ID 可能优于比较引用。获取引用后,引用指向的内容(数据)可能会在您身后(由另一个线程)更改。
- 或者,即使在同一个线程中,为了进一步使用而存储的引用也会被一些其他不可预见的动作释放和/或修改。
所以,我们可以使用一些关于内容的引用,并确保它们可以一直使用(释放内存时引用可能变得无效)。此外,当使用一些数据(如 ID)而不是整个内容时,性能将得到优化。
Apple Core Graphics 的 CGColor 中这个 nextID 的真正意图是/可能是什么?它是从以前的方法遗留下来的,所以不能完全放弃吗?