什么是__NSCFData以及它与NSData的关系?

时间:2017-09-08 23:18:49

标签: ios

我在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'

我通读了NSDataCFDatatoll-free bridging

上的文档

我还查看了__NSCFData的标题,它是NSImmutableData的子类。还有一个NSCFData课程,这让我很困惑。

我有以下问题:

  1. __NSCFData中的双下划线是什么?
  2. 究竟是什么NSCFData?也许它是一种含糊不清的类型,可以引用NSDataCFData对象?

1 个答案:

答案 0 :(得分:2)

许多基金会类型和相应的CoreFoundation类型都是"免费桥接"相互之间,这意味着CoreFoundation结构的内部布局与Objective-C对象的内部布局相同,结果是免费桥接的NS和CF类型可以简单地相互投射而无需经过任何转换过程。 NSDataCFDataRef是以这种方式桥接的类型的示例;您可以从普通C中取CFDataRef,将其转换为NSData *,并将其用作Objective-C对象,它将起作用。

当然,为了实现所有这些魔力,有很多hackery正在进行,包括许多私人类型,如__NSCFData。这些通常是您不必担心的实施细节;相关的部分是您的对象属于NSData的子类,因此您可以在其上使用NSData的方法(而不是NSString' s;您发布的错误消息表明代码中的某些内容正在尝试将NSString的{​​{1}}方法发送到-isEqualToString:对象,这是无效的)

无论如何,要弄清楚试图将错误消息发送到NSData对象的代码,请在调试器中设置异常断点,并且一旦程序遇到错误就应该立即将其打开。