NSBundle* mainBundle = [NSBundle mainBundle];
我知道我们可以使用上面的来获取 mainBundle
但是我看到有人用
CFBundleRef mainBundle = CFBundleGetMainBundle();
这两者有什么区别吗?
NSBundle* mainBundle = [NSBundle mainBundle];
我知道我们可以使用上面的来获取 mainBundle
但是我看到有人用
CFBundleRef mainBundle = CFBundleGetMainBundle();
这两者有什么区别吗?
NSBundle
并且CFBundleRef
不是免费桥接的,所以你不能说它们是相同的,但它们都做同样的工作并提供相同的功能。您使用哪个应该只取决于您将如何在当前代码中使用它。
Wain 是正确的,这些都不是免费的。
Cocoa 文档更详细地描述了差异(CFBundle 和 NSBundle,强调了):
大多数 [NSBundle's] 方法调用相应的 CFBundle 例程并以它们为模型。但是请注意,指向 NSBundle 对象的指针不能转换为 CFBundleRefs,这与其他一些 Core Foundation 类型和 Foundation 等价物不同——<strong>它们不是免费桥接的。
对于它的大多数方法,NSBundle 只是简单地调用适当的 CFBundle 例程来完成它的工作,但是加载代码是不同的。因为 CFBundle 不处理 Objective-C 符号,所以 NSBundle 必须使用不同的机制来加载代码。NSBundle 与 Objective-C 运行时系统交互以正确加载和注册捆绑可执行文件中的所有 Cocoa 类和其他可执行代码。
至少,Cocoa 包包含一个类,即主体类,它充当包的入口点。有关主体类的讨论,请参阅 Cocoa 中的可加载包。
由于 Objective-C 运行时系统的限制,NSBundle 无法卸载可执行代码。由于 CFBundle 不知道 Objective-C 符号,所以不要在 NSBundle 对象上使用 CFBundle 加载和卸载例程。但是,您可以为 Cocoa 包创建一个 CFBundle 对象并使用其他例程(与加载和卸载无关)而不会遇到麻烦。