Objective c 确定什么是CFTypeRef?
我有一个函数返回CFTypeRef。我不知道它到底是什么。我如何确定这一点?例如,它可能是一个CFStringRef :Objective c 确定什么是CFTypeRef?,objective-c,core-foundation,Objective C,Core Foundation,我有一个函数返回CFTypeRef。我不知道它到底是什么。我如何确定这一点?例如,它可能是一个CFStringRef : 简而言之,你可以(见戴夫·德隆斯的答案)。答案很长,你不能。两者都是正确的。一个更好的问题可能是“你为什么需要知道?”在我看来,如果你能安排一些你不需要知道的事情,你可能会过得更好 我不是说你做不到,甚至不是说你不应该做。我想说的是,当你开始走这条路时,会有一些隐藏的陷阱,有时你并不真正意识到所有未陈述的假设是什么。不幸的是,正确的编程依赖于了解所有的小细节。在我脑海中,以下
简而言之,你可以(见戴夫·德隆斯的答案)。答案很长,你不能。两者都是正确的。一个更好的问题可能是“你为什么需要知道?”在我看来,如果你能安排一些你不需要知道的事情,你可能会过得更好 我不是说你做不到,甚至不是说你不应该做。我想说的是,当你开始走这条路时,会有一些隐藏的陷阱,有时你并不真正意识到所有未陈述的假设是什么。不幸的是,正确的编程依赖于了解所有的小细节。在我脑海中,以下是一些潜在的陷阱:
-
据我所知,在每个主要操作系统版本中,核心基础类型的集合都增加了。因此,每个主要OS版本都有上一版本的超集核心基础类型,并且可能是一个严格的超集。这是“观察到的行为”,不一定是“保证”的行为。需要注意的重要一点是,“事情可以而且确实会改变”,在所有情况相同的情况下,更简单、更容易的解决方案往往不会考虑到这一点。不管原因或理由如何,编写将来会中断的代码通常被认为是糟糕的编程风格
- 从逻辑上讲,
是CFMutableStringRef
的严格超集。因此,将真正不可变的CFStringRef
传递给CFStringRef
API调用将导致“某种问题”。虽然现在可能不是这样(即10.6),但我知道以下事实在过去是正确的:CFMutableString
API调用没有验证“string参数”实际上是可变的(对于区分不可变和可变的所有类型,这实际上都是正确的)。检查是存在的,但它们是以调试断言的形式出现的,在“发布”版本中被禁用(换句话说,在实践中从未执行过检查) 官方认为(或可能认为)这不是一个bug,并且(琐碎的)可变性检查是“出于性能原因”而没有进行的。没有提供“公共”API来告诉CFMutableString
指针的可变性(或任何类型的可变性)。结合免费桥接,这意味着您可以变异不可变的CFString
对象,即使NSString
api确实执行了可变性检查,并在尝试变异不可变对象时导致了“某种问题”。您的源代码中的NSMutableString
常量字符串在运行时被映射到只读内存 我记得,官方的说法是“不要将不可变对象(CFStringRef或NSString)传递给CFMutableString API,而且这样做是一个bug”。当有人指出这一立场可能存在一些与安全相关的问题(更不用说这根本不可能的事实),比如说,如果有人犯了严重依赖字符串(尤其是“众所周知的”字符串)的不变性的错误,答案是“这个问题是理论性的,在证明可行的开发之前,目前不会采取任何行动。”@“
更新:我很想知道当前的行为是什么。在我运行10.6.4的机器上,在不可变的
上使用CFString
API会导致不可变的字符串本质上变成CFMutableString
,这至少比以前更好(如果您想在开发过程中找出类型a@“
,可以使用以下代码段CFTypeRef
printf("CFTypeRef type is: %s\n",CFStringGetCStringPtr(CFCopyTypeIDDescription(CFGetTypeID(myObjectRef)),kCFStringEncodingUTF8));
这将为类型打印一个人类可读的名称,以便您知道它是什么。但苹果公司不保证它们将保持这些描述的一致性,因此不要在生产代码中使用此名称。(因为代码片段会泄漏内存,但您应该只在开发过程中使用它,所以谁在乎呢).是的,其余的CFTYPE呢?有很多CFTYPE,不能为每个CFTYPE都这样做。我需要知道的原因是,我从IO注册表中检索了一个属性,它可以是很多东西,但我无法确定它是什么。这与objective-C没有任何关系。printf("CFTypeRef type is: %s\n",CFStringGetCStringPtr(CFCopyTypeIDDescription(CFGetTypeID(myObjectRef)),kCFStringEncodingUTF8));
=
表示“等于”和≡代码>表示“与相同”。有一个区别,这可能重要,也可能不重要,取决于上下文。作为警告,这往往是臭虫自由游荡的地方
例如,CFMutableStringRef
可以在任何可以使用CFStringRef
的地方使用,或者CFStringRef=CFMutableStringRef
。但是,您不能在任何地方使用CFStringRef
,因为明显的原因,可以使用CFMutableStringRef
。这意味着CFStringRef≢ CFMutableStringRef
。同样,根据上下文的不同,它们可以是相等的,但它们并不完全相同
重要的是要注意,虽然有一个CFStringGetTypeID()
,但没有相应的CFMutableStringGetTypeID()