Objective c 确定什么是CFTypeRef?

Objective c 确定什么是CFTypeRef?,objective-c,core-foundation,Objective C,Core Foundation,我有一个函数返回CFTypeRef。我不知道它到底是什么。我如何确定这一点?例如,它可能是一个CFStringRef : 简而言之,你可以(见戴夫·德隆斯的答案)。答案很长,你不能。两者都是正确的。一个更好的问题可能是“你为什么需要知道?”在我看来,如果你能安排一些你不需要知道的事情,你可能会过得更好 我不是说你做不到,甚至不是说你不应该做。我想说的是,当你开始走这条路时,会有一些隐藏的陷阱,有时你并不真正意识到所有未陈述的假设是什么。不幸的是,正确的编程依赖于了解所有的小细节。在我脑海中,以下

我有一个函数返回CFTypeRef。我不知道它到底是什么。我如何确定这一点?例如,它可能是一个CFStringRef


简而言之,你可以(见戴夫·德隆斯的答案)。答案很长,你不能。两者都是正确的。一个更好的问题可能是“你为什么需要知道?”在我看来,如果你能安排一些你不需要知道的事情,你可能会过得更好

我不是说你做不到,甚至不是说你不应该做。我想说的是,当你开始走这条路时,会有一些隐藏的陷阱,有时你并不真正意识到所有未陈述的假设是什么。不幸的是,正确的编程依赖于了解所有的小细节。在我脑海中,以下是一些潜在的陷阱:

    据我所知,在每个主要操作系统版本中,核心基础类型的集合都增加了。因此,每个主要OS版本都有上一版本的超集核心基础类型,并且可能是一个严格的超集。这是“观察到的行为”,不一定是“保证”的行为。需要注意的重要一点是,“事情可以而且确实会改变”,在所有情况相同的情况下,更简单、更容易的解决方案往往不会考虑到这一点。不管原因或理由如何,编写将来会中断的代码通常被认为是糟糕的编程风格

    >P>由于核心基础和基础之间的免费桥接,仅仅因为<代码> CFTyEFEF=CFSTRIGRIFF < /代码>并不意味着<代码> CFTyPrEF≡ CFStringRef,其中
    =
    表示“等于”和
    表示“与相同”。有一个区别,这可能重要,也可能不重要,取决于上下文。作为警告,这往往是臭虫自由游荡的地方

    例如,
    CFMutableStringRef
    可以在任何可以使用
    CFStringRef
    的地方使用,或者
    CFStringRef=CFMutableStringRef
    。但是,您不能在任何地方使用
    CFStringRef
    ,因为明显的原因,可以使用
    CFMutableStringRef
    。这意味着
    CFStringRef≢ CFMutableStringRef
    。同样,根据上下文的不同,它们可以是相等的,但它们并不完全相同

    重要的是要注意,虽然有一个
    CFStringGetTypeID()
    ,但没有相应的
    CFMutableStringGetTypeID()

  • 从逻辑上讲,
    CFMutableStringRef
    CFStringRef
    的严格超集。因此,将真正不可变的
    CFStringRef
    传递给
    CFMutableString
    API调用将导致“某种问题”。虽然现在可能不是这样(即10.6),但我知道以下事实在过去是正确的:
    CFMutableString
    API调用没有验证“string参数”实际上是可变的(对于区分不可变和可变的所有类型,这实际上都是正确的)。检查是存在的,但它们是以调试断言的形式出现的,在“发布”版本中被禁用(换句话说,在实践中从未执行过检查)

    官方认为(或可能认为)这不是一个bug,并且(琐碎的)可变性检查是“出于性能原因”而没有进行的。没有提供“公共”API来告诉
    CFString
    指针的可变性(或任何类型的可变性)。结合免费桥接,这意味着您可以变异不可变的
    NSString
    对象,即使
    NSMutableString
    api确实执行了可变性检查,并在尝试变异不可变对象时导致了“某种问题”。您的源代码中的
    @“
    常量字符串在运行时被映射到只读内存

    我记得,官方的说法是“不要将不可变对象(CFStringRef或NSString)传递给CFMutableString API,而且这样做是一个bug”。当有人指出这一立场可能存在一些与安全相关的问题(更不用说这根本不可能的事实),比如说,如果有人犯了严重依赖字符串(尤其是“众所周知的”字符串)的不变性的错误,答案是“这个问题是理论性的,在证明可行的开发之前,目前不会采取任何行动。”


    更新:我很想知道当前的行为是什么。在我运行10.6.4的机器上,在不可变的
    CFString
    上使用
    CFMutableString
    API会导致不可变的字符串本质上变成
    @“
    ,这至少比以前更好(如果您想在开发过程中找出类型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));