【发布时间】:2013-10-26 14:31:56
【问题描述】:
我希望通过这项研究了解 CoreFoundation CGColor 对象的内部结构。我可以从免费的石英项目中找到一个 CGColor 结构的示例定义,它似乎与 IOS 声明相匹配(依赖于我的研究)。
typedef struct CGColor {
CFRuntimeBase obj;
CFTypeID colorID;
CGColorSpaceRef colorSpace;
CGPatternRef pattern;
size_t numberOfComponents;
CGFloat *components;
} *CGColorRef;
(colorID 字段被免费石英命名为 nextID,但我认为它旨在作为 IOS 的颜色的唯一标识符,因此它不是一种下一个标识符。)
持有一个全局线程安全唯一值,对于创建并分配给 colorID 成员的每个 CGColor 对象,该值递增 1。只有未记录的 CGColorGetIdentifier() 函数返回此值。 (我猜测 id 值是单调递增的,它可能会在设备之间转换为校准颜色查找时提高性能,反之亦然。)
我检查了 CoreGraphics 及其资源库。我发现只有 ripc_GetColor (libRIP.A.dylib) 函数调用了 CGColorGetIdentifier() 函数。
CGColorGetIdentifier 的调用堆栈;(希望有助于推断 colorID)
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
对于当前颜色图形上下文操作,ripc_GetColor() 计算当前笔触/填充颜色的一些转换,并将这些转换与该颜色的引用和 colorID 一起缓存。
因此,对于下一个图形上下文操作,ripc_GetColor() 比较先前缓存的和当前的参考和 colorID 值,以跳过已经为上一个图形上下文操作缓存的颜色转换。
我们知道释放对象的引用(内存地址)可以在创建另一个对象时使用。所以仅仅检查引用是不够的,相同的颜色对象是有效的,但我们需要比较内容或某种哈希值。因此,我们可以为此目的使用唯一标识符值。
但是,标识符可以用于单个对象及其引用,因此仅比较 id 就足够了。但是,refs 和 ids 都被使用了。我不认为工程师忽略了这样一个简单而关键的事情。
所以,我试图找出比较 ids 和 refs 的必要性,而只比较 ids 就足够了。
它是从以前的方法遗留下来的,所以不能完全放弃吗?
【问题讨论】:
-
你查看过 CFTypeID 吗? developer.apple.com/library/mac/documentation/corefoundation/…
-
对不起,这与 CFTypeID 无关。
-
您正在研究实施细节。学术上很有趣,但在生产代码中通常没有用处,除非你发现了一个特定的行为,它的表现非常糟糕,以至于阻碍了你。
-
@bbum 你的评论到底有什么意义?
-
@BrennanVincent。创建依赖于实现细节的代码可能会被破坏。
标签: ios c core-foundation opaque-pointers