我在 iOS 中遇到以下错误,无法很好地了解 __NSCFData 是什么。我理解错误发生的原因并且我们已经解决了这个问题,但我对错误消息中出现的不熟悉的类感到好奇。
2017-08-07 21:41:37.458 [**App name redacted**][5316:2314238]
*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[__NSCFData isEqualToString:]: unrecognized selector sent
to instance 0x6080000b97b0'
我阅读了 NSData 上的文档, CFData , 和 toll-free bridging
我还查看了 __NSCFData 的标题它是 NSImmutableData 的子类。还有一个NSCFData 课也是,这让我很困惑。
我有以下问题:
__NSCFData 中的双下划线是干什么用的?
NSCFData 到底是什么?也许它是一种模棱两可的类型,可以引用 NSData 或 CFData 对象?
Best Answer-推荐答案 strong>
许多 Foundation 类型和对应的 CoreFoundation 类型是“免费桥接”的,这意味着 CoreFoundation 结构的内部布局与 Objective-C 对象的布局相同,结果是免费桥接NS 和 CF 类型可以简单地相互转换,而无需经过任何转换过程。 NSData 和 CFDataRef 就是以这种方式桥接的类型示例;您可以从纯 C 中获取 CFDataRef ,将其转换为 NSData * ,并将其用作 Objective-C 对象,这样就可以工作了。
当然,为了实现所有这些魔法,在幕后进行了大量的黑客攻击,包括许多私有(private)类型,例如 __NSCFData 。这些通常是您无需担心的实现细节;相关的部分是您的对象属于 NSData 的子类,因此您可以在其上使用 NSData 的方法(而不是 NSString 的;您发布的错误消息表明您的代码中的某些内容正在尝试将 NSString 的 -isEqualToString: 方法发送到 NSData 对象,这是无效的)。
无论如何,要弄清楚是什么代码试图将错误消息发送到 NSData 对象,请在调试器中设置一个异常断点,然后在程序运行时立即将其打开错误。
关于ios - 什么是 __NSCFData,它与 NSData 有什么关系?,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/46125664/
|