gpt4 book ai didi

objective-c - 将基本的 CFTypeRef 转换为更具体的 CoreFoundation 类型

转载 作者:搜寻专家 更新时间:2023-10-30 20:11:24 25 4
gpt4 key购买 nike

有没有一种简单的方法可以将 CTypeRef 转换为特定的 CoreFoundation 类型?我不想将内联转换为 (CFStringRef)myObjectRef,而是想创建一个辅助方法来为所有 CoreFoundation 类型执行此操作。

我知道可以使用类似 CFGetTypeID(myObjectRef) == CFStringGetTypeID() 的东西来查明 CTypeRef 是否是 CFString .然而,创建一个方法来执行此操作可能会变得非常冗长并且有很多 if 语句。

用一堆针对 CFGetTypeID() 的 if 语句构建一个方法是唯一的方法吗?或者有更简单的方法吗?

更新:示例

我想创建一个辅助函数来处理一些我无法更改的遗留代码。目前,它生成 CFDictionaryRefCFStringRefCFURLRef 之一作为作为 CTypeRef 提供的返回值。我目前正在通过对返回值运行 CFGetTypeID() 来解决这个问题,但这并不理想。我宁愿使用 CastToCF() 助手来为我处理这个问题,而不是到处使用 C 风格的转换。这也有助于在未来简化测试。

附言我不担心可变类型。

最佳答案

这样做没有明显的意义。 c 风格转换与其他语言不同——它是一种类型转换,左侧的地址将与右侧的地址相同。如果您进行了错误的转换(与其他语言不同),cftypes 将不会抛出或返回 null。 iow,它只是您指定类型的装饰,c 编译器会假定您的转换是有效的。

或者您可以提供一个更好的示例来说明如何使用它(如果这样做没有帮助的话)。

更新

好的。既然你把它标记为 objc++,我就创建一个帮助程序类,它有大量的诊断并完成所有嘈杂的转换(最小插图):

class t_helper {
public:
t_helper(CFTypeRef cf) : d_cf(cf), d_type(CFGetTypeID(cf)) { assert(this->d_cf); }
~t_helper() {}

/* type info */
bool isString() const { return CFStringGetTypeID() == this->type(); }
CFStringRef string() { assert(this->isString()); return this->cf_cast<CFStringRef>(); }

bool isDictionary() const { return CFDictionaryGetTypeID() == this->type(); }
CFDictionaryRef dictionary() { assert(this->isDictionary()); return this->cf_cast<CFDictionaryRef>(); }

...

/* and a trivial example of an operation */
void appendMutableCopyToArray(CFMutableArrayRef array) {
if (this->isString()) {
CFMutableStringRef cp(CFStringCreateMutableCopy(0,0,this->string()));
CFArrayAppendValue(array, cp);
CFRelease(cp);
}
...
}

...

private:
template < typename T > T cf_cast() { return reinterpret_cast<T>(this->d_cf); }
const CFTypeID type() const { return this->d_type; }
private:
CFTypeRef d_cf;
const CFTypeID d_type;
};

在没有您正在处理的程序的具体示例的情况下,这是我所能得到的最准确的信息。

关于objective-c - 将基本的 CFTypeRef 转换为更具体的 CoreFoundation 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7415250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com