如果 Apple 建议不对类型 ID 进行硬编码,如何识别核心基础对象



我的应用程序与 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()和朋友,但每个此类函数只调用一次。

最新更新