3

我的应用程序与 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 总是试图用新版本破坏现有代码?

4

2 回答 2

2

不幸的是,如果您不想冒险让您的应用因未来的操作系统更新而崩溃,您必须进行比较:

if( CFGetTypeID(myUnknownCFObject) == CFArrayGetTypeID() ) {
  // handle the object as a CFArray
} else if( /* ... etc. ... */ ) {
} else {
  // we don't know how to deal with this object
}
于 2012-04-19T15:44:43.117 回答
1

在您的初始化代码中,您可以设置一个静态结构,可能是一个字典或 std::map,CFTypeID将 s 关联到函数指针或选择器。这样你就可以使用CFBooleanGetTypeID()和朋友,但只调用每个这样的函数一次。

于 2012-04-19T16:34:34.803 回答