我在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
对象?答案 0 :(得分:2)
许多基金会类型和相应的CoreFoundation类型都是"免费桥接"相互之间,这意味着CoreFoundation结构的内部布局与Objective-C对象的内部布局相同,结果是免费桥接的NS和CF类型可以简单地相互投射而无需经过任何转换过程。 NSData
和CFDataRef
是以这种方式桥接的类型的示例;您可以从普通C中取CFDataRef
,将其转换为NSData *
,并将其用作Objective-C对象,它将起作用。
当然,为了实现所有这些魔力,有很多hackery正在进行,包括许多私人类型,如__NSCFData
。这些通常是您不必担心的实施细节;相关的部分是您的对象属于NSData
的子类,因此您可以在其上使用NSData
的方法(而不是NSString
' s;您发布的错误消息表明代码中的某些内容正在尝试将NSString
的{{1}}方法发送到-isEqualToString:
对象,这是无效的)
无论如何,要弄清楚试图将错误消息发送到NSData
对象的代码,请在调试器中设置异常断点,并且一旦程序遇到错误就应该立即将其打开。