NSBundle和CFbundle有什么区别?

时间:2013-08-15 14:18:42

标签: ios

 NSBundle* mainBundle = [NSBundle mainBundle];

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

但我看到有人使用

CFBundleRef mainBundle = CFBundleGetMainBundle();

这两者之间有什么区别吗?

2 个答案:

答案 0 :(得分:1)

NSBundleCFBundleRef互不桥接,所以你不能说它们是相同的,但它们都做同样的工作并提供相同的功能。您使用的只能由您在当前代码中使用它的方式驱动。

答案 1 :(得分:0)

警告是正确的,它们并不是免费的桥梁。

可可文档更详细地描述了差异(CFBundle and NSBundle,已加重点):

[NSBundle的]大多数方法都调用相应的CFBundle例程,并以此为基础进行建模。但是请注意,与某些其他Core Foundation类型和Foundation等效项不同的是,指向NSBundle对象的指针不能转换为CFBundleRefs-它们不是免费桥接的

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

至少,可可束包含一个类,即主体类,它是束的入口点。有关主体类的讨论,请参见可可中的可装载捆绑包。

由于受Objective-C运行时系统的限制,NSBundle无法卸载可执行代码。由于CFBundle不了解Objective-C符号,因此请勿在NSBundle对象上使用CFBundle加载和卸载例程。但是,您可以为Cocoa捆绑包创建CFBundle对象,并使用其他与加载和卸载无关的例程,而不会遇到麻烦。