菜鸟教程小白 发表于 2022-12-13 02:34:59

ios - 什么是 __NSCFData,它与 NSData 有什么关系?


                                            <p><p>我在 iOS 中遇到以下错误,无法很好地了解 <strong><code>__NSCFData</code></strong> 是什么。我理解错误发生的原因并且我们已经解决了这个问题,但我对错误消息中出现的不熟悉的类感到好奇。</p>

<pre><code>2017-08-07 21:41:37.458 [**App name redacted**]
*** Terminating app due to uncaught exception &#39;NSInvalidArgumentException&#39;,
reason: &#39;-: unrecognized selector sent
to instance 0x6080000b97b0&#39;
</code></pre>

<p>我阅读了 <a href="https://developer.apple.com/documentation/foundation/nsdata" rel="noreferrer noopener nofollow"><code>NSData</code></a> 上的文档, <a href="https://developer.apple.com/documentation/corefoundation/cfdata-rv9" rel="noreferrer noopener nofollow"><code>CFData</code></a> , 和 <a href="https://developer.apple.com/library/content/documentation/General/Conceptual/CocoaEncyclopedia/Toll-FreeBridgin/Toll-FreeBridgin.html#//apple_ref/doc/uid/TP40010810-CH2" rel="noreferrer noopener nofollow">toll-free bridging</a> </p>

<p>我还查看了 <a href="https://github.com/nst/iOS-Runtime-Headers/blob/master/Frameworks/CoreFoundation.framework/__NSCFData.h" rel="noreferrer noopener nofollow"><code>__NSCFData</code></a> 的标题它是 <code>NSImmutableData</code> 的子类。还有一个<a href="https://github.com/nst/iOS-Runtime-Headers/blob/master/Frameworks/Foundation.framework/NSCFData.h" rel="noreferrer noopener nofollow"><code>NSCFData</code></a>课也是,这让我很困惑。</p>

<p>我有以下问题:</p>

<ol>
<li><code>__NSCFData</code> 中的双下划线是干什么用的?</li>
<li><code>NSCFData</code> 到底是什么?也许它是一种模棱两可的类型,可以引用 <code>NSData</code> 或 <code>CFData</code> 对象?</li>
</ol></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>许多 Foundation 类型和对应的 CoreFoundation 类型是“免费桥接”的,这意味着 CoreFoundation 结构的内部布局与 Objective-C 对象的布局相同,结果是免费桥接NS 和 CF 类型可以简单地相互转换,而无需经过任何转换过程。 <code>NSData</code> 和 <code>CFDataRef</code> 就是以这种方式桥接的类型示例;您可以从纯 C 中获取 <code>CFDataRef</code>,将其转换为 <code>NSData *</code>,并将其用作 Objective-C 对象,这样就可以工作了。</p>

<p>当然,为了实现所有这些魔法,在幕后进行了大量的黑客攻击,包括许多私有(private)类型,例如 <code>__NSCFData</code>。这些通常是您无需担心的实现细节;相关的部分是您的对象属于 <code>NSData</code> 的子类,因此您可以在其上使用 <code>NSData</code> 的方法(而不是 <code>NSString</code> 的;您发布的错误消息表明您的代码中的某些内容正在尝试将 <code>NSString</code> 的 <code>-isEqualToString:</code> 方法发送到 <code>NSData</code> 对象,这是无效的)。</p>

<p>无论如何,要弄清楚是什么代码试图将错误消息发送到 <code>NSData</code> 对象,请在调试器中设置一个异常断点,然后在程序运行时立即将其打开错误。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 什么是 __NSCFData,它与 NSData 有什么关系?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/46125664/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/46125664/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 什么是 __NSCFData,它与 NSData 有什么关系?