Kri*_*oks 9 objective-c core-foundation
我有一个返回CFTypeRef的函数.我不知道它究竟是什么.我该如何确定?例如,它可能是CFStringRef.
Dav*_*ong 18
if (CFGetTypeID(myObjectRef) == CFStringGetTypeID()) {
//i haz a string
}
Run Code Online (Sandbox Code Playgroud)
简短的回答是你可以(见Dave DeLongs的回答).答案很长,你不能.两者都是真的.一个更好的问题可能是"你为什么需要知道?" 在我看来,如果你可以安排你不需要知道的事情,你可能会变得更好.
我不是说你不能这样做,甚至你不应该这样做.我所说的是,当你开始沿着这条道路时,有一些隐藏的陷阱,有时候你并没有真正意识到所有未说明的假设是什么.不幸的是,正确编程取决于了解所有细节.在我的头顶,这里有一些潜在的陷阱:
To the best of my knowledge the set of Core Foundation types has increased in each major OS release. Therefore each major OS release has a superset Core Foundation types of the previous releases, and likely a strict superset at that. This is "observed behavior", and not necessarily "guaranteed" behavior. The important thing to note is that "things can and do change", and all things being equal, the easier and simpler solutions tend not to take this in to account. It is generally considered poor programming style to code something that breaks in the future, regardless of the reason or justification.
由于核心基金会和基金会之间的免费桥接,仅仅因为a CFTypeRef = CFStringRef并不意味着a CFTypeRef ? CFStringRef,其中=意味着"等于"并且?意味着"相同".根据具体情况,有一个区别,可能重要也可能不重要.作为警告,这往往是bug自由漫游的地方.
例如,a CFMutableStringRef可以在任何可以使用的地方CFStringRef使用,或者CFStringRef = CFMutableStringRef.但是,由于显而易见的原因,你无法使用CFStringRef到处CFMutableStringRef都可以使用.这意味着CFStringRef ? CFMutableStringRef.同样,根据上下文,它们可以相等,但它们并不相同.
这是非常值得注意的是,虽然有一个重要的CFStringGetTypeID(),也没有相应的CFMutableStringGetTypeID().
逻辑上,CFMutableStringRef是一个严格的超集CFStringRef.那么,随之而来的是,将一个真正的不可变CFStringRef传递给CFMutableStringAPI调用会导致"某种问题".虽然现在可能不是这样(即10.6),但我知道过去的事实如下:CFMutableStringAPI调用没有验证"字符串参数"实际上是可变的(这对所有类型都是如此)它区分了不可变和可变的).检查在那里,但它们是在"发布"版本中禁用的调试断言的形式(换句话说,检查从未在实践中执行).
这是(或可能是)官方不被认为是一个错误,并且(出于性能原因)没有进行(微不足道)可变性检查.没有提供"公共"API来告诉指针的可变性(或任何类型的可变性).结合Toll-Free桥接,这意味着您可以改变不可变对象,即使API确实执行可变性检查并在尝试改变不可变对象时导致"某种问题".味道,源中的常量字符串在运行时映射到只读内存.CFStringNSStringNSMutableString@""
我记得,官方的一句是"不要将不可变对象(无论是CFStringRef还是NSString)传递给CFMutableString API,而且更多的是,这是一个错误".当有人指出这个立场可能存在一些与安全相关的问题时(更不用说从根本上说这是不可能的事实),比如根据字符串的不变性来判断是否有任何错误,特别是"众所周知"字符串,答案是"问题是理论上的问题,此时不会做任何事情,直到可以证明可行的利用为止."
更新:我很想知道当前的行为是什么.在我的机器上运行10.6.4,CFMutableString在不可变的情况下使用API CFString导致不可变的字符串变得基本上@"",这至少比它之前做的更好(<= 10.5)并实际上改变了字符串.绝对不是理想的解决方案,它具有苦涩的现实世界的味道,它唯一的救赎品质是它是"最差的解决方案".
所以请记住,在你的假设中要小心!你可以这样做,但如果这样做,它更重要的是,你不这样做不对.:)当然,很多"错误"的解决方案都可行,所以事情正在发挥作用并不一定证明你做得对.美好时光!
此外,在Duck Typed系统中,它通常被认为是糟糕的形式,甚至可能是一个错误,"过于仔细地看待对象的类型".Objective-C绝对是一个Duck Typed系统,由于Toll-Free桥接的紧密耦合,毫无疑问会渗透到Core Foundation. CFTypeRef这种鸭型模糊性的直接表现,并且在很大程度上取决于背景,可能是一种明确的说法"你不应该过于密切关注这些类型".
| 归档时间: |
|
| 查看次数: |
7988 次 |
| 最近记录: |