代码之家  ›  专栏  ›  技术社区  ›  Kristina

确定什么是CFTypeRef?

  •  8
  • Kristina  · 技术社区  · 15 年前

    我有一个函数 CFTypeRef型 CFStringRef公司 .

    3 回复  |  直到 15 年前
        1
  •  20
  •   Dave DeLong    15 年前

    CFGetTypeID() :

    if (CFGetTypeID(myObjectRef) == CFStringGetTypeID()) {
      //i haz a string
    }
    
        2
  •  9
  •   johne    15 年前

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

    正确地 取决于知道所有的小细节。在我的脑海里,有几个潜在的陷阱:

    • 因为核心基础和基础之间的免费桥梁 CFTypeRef = CFStringRef 并不意味着 CFTypeRef ≡ CFStringRef ,在哪里 = ≡ 意思是“等同于”。有一个区别,这可能是重要的,也可能不是取决于上下文。作为警告,这里往往是虫子自由游荡的地方。

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

      它是 需要注意的是 CFStringGetTypeID() CFMutableStringGetTypeID() .

    • 逻辑上, CFMutableStringRef 是的严格超集 CFStringRef公司 CFStringRef公司 CFMutableString CFMutableString API调用没有验证“字符串参数”实际上是可变的(对于区分不可变和可变的所有类型,这实际上都是真的)。检查是存在的,但它们是以调试断言的形式出现的,在“发布”版本中被禁用(换句话说,实际上从未执行过检查)。

      琐碎的 “出于性能原因”完成。没有提供“public”API来告诉 CFString 指针(或任何类型的可变)。再加上免费桥接,这意味着你可以变异成不可变的 NSString 对象,即使 NSMutableString @"" 源中的常量字符串在运行时映射到只读内存。

      我记得,官方的说法是“不要将不可变的对象(CFStringRef或NSString)传递给cfmutablestringapi,而且这样做是一个bug”。当有人指出这一立场可能存在一些与安全相关的问题(更不用说这根本不可能的事实)时,如果有人犯过严重依赖字符串,特别是“众所周知”的字符串的不变性的错误,答案是“问题是理论上的,根本不会做任何事情”这一次,直到一个可行的利用可以证明。”

      更新: CFMutableString API是不可变的 CFString字符串 使不可变的字符串

    所以请记住,小心你的假设!你可以做到,但如果你做到了,更重要的是 去做吧 . :)当然,很多“错误”的解决方案都会奏效,所以事情奏效的事实并不一定证明你做得对。好时光!

    Duck Typed “过于仔细地观察对象的类型”通常被认为是不好的形式,甚至可能是一个bug。Objective-C绝对是一个鸭型系统,由于免费桥接的紧密耦合,这无疑会流入核心基础。 CFTypeRef 是这种Duck类型歧义的直接表现,并且在很大程度上取决于上下文,可能是一种明确的表达方式“你不应该太仔细地看类型”。

        3
  •  2
  •   Camden Narzt    9 年前

    如果你想知道a型是什么 CFTypeRef 在开发过程中,可以使用以下代码段。

    printf("CFTypeRef type is: %s\n",CFStringGetCStringPtr(CFCopyTypeIDDescription(CFGetTypeID(myObjectRef)),kCFStringEncodingUTF8));