繁体   English   中英

NSBundle 和 CFbundle 有什么区别?

[英]what the difference between NSBundle and CFbundle?

 NSBundle* mainBundle = [NSBundle mainBundle];

我知道我们可以使用上面的来获取 mainBundle

但是我看到有人用

CFBundleRef mainBundle = CFBundleGetMainBundle();

这两者有什么区别吗?

NSBundleCFBundleRef不是免费桥接的,所以你不能说它们是相同的,但它们都做同样的工作并提供相同的功能。 您使用的应该只取决于您将如何在当前代码中使用它。

Wain 是正确的,这些不是免费的。

Cocoa 文档更详细地描述了差异( CFBundle 和 NSBundle ,强调了添加):

大多数 [NSBundle's] 方法调用相应的 CFBundle 例程并以它们为模型 但是请注意,指向 NSBundle 对象的指针不能转换为 CFBundleRefs,这与其他一些 Core Foundation 类型和 Foundation 等价物不同——它们不是免费的桥接

对于它的大多数方法,NSBundle 只是调用适当的 CFBundle 例程来完成它的工作,但是加载代码是不同的 因为 CFBundle 不处理 Objective-C 符号,所以 NSBundle 必须使用不同的机制来加载代码。 NSBundle 与 Objective-C 运行时系统交互以正确加载和注册 bundle 可执行文件中的所有 Cocoa 类和其他可执行代码。

至少,Cocoa 包包含一个类,即主体类,它充当包的入口点。 有关主要类的讨论,请参阅 Cocoa 中的可加载包。

由于 Objective-C 运行时系统的限制,NSBundle 无法卸载可执行代码。 由于 CFBundle 不知道 Objective-C 符号,所以不要在 NSBundle 对象上使用 CFBundle 加载和卸载例程。 但是,您可以为 Cocoa 包创建 CFBundle 对象并使用其他例程——与加载和卸载无关——没有问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM