我的应用程序与 CoreFoundation 库接口。另一个库的某些函数返回一个核心基础对象,我需要识别对象的类型才能处理数据。现在,查看CFType库参考,Apple清楚地指出以下内容:"由于类型 ID 的值可能因版本而异,因此代码不应依赖于存储或硬编码的类型 ID,也不应硬编码类型 ID 的任何观察到的属性(例如,它是一个小整数)。
基于此,我必须避免任何枚举(CFArray = 18, CFBoolean = 21
等)。唯一应该有效并且不受新版本更改影响的是:
int ID = CFGetTypeID(obj);
if ID = CFBooleanGetTypeID()
然后... if ID = CFStringGetTypeID()
然后... if ID = CFDataGetTypeID()
那么..等等...
这真的是一件可怕的事情。大量调用仅用于标识对象。
Apple还建议不要对从CFCopyTypeIDDescription返回的信息的内容或格式创建依赖关系,因此我还必须排除此选项。
有谁知道我如何轻松识别返回的核心基础类型以及为什么 Apple 总是试图用新版本破坏现有代码?
如果您不想冒着应用程序在未来的操作系统更新中中断的风险,则必须进行比较:
if( CFGetTypeID(myUnknownCFObject) == CFArrayGetTypeID() ) {
// handle the object as a CFArray
} else if( /* ... etc. ... */ ) {
} else {
// we don't know how to deal with this object
}
在初始化代码中,您可以设置一个静态结构,可能是字典或 std::map,将CFTypeID
s 与函数指针或选择器相关联。 这样,您将使用CFBooleanGetTypeID()
和朋友,但每个此类函数只调用一次。