![](/img/trans.png)
[英]What's the difference between nil and NSBundle in UIStoryboard()?
[英]what the difference between NSBundle and CFbundle?
NSBundle* mainBundle = [NSBundle mainBundle];
我知道我们可以使用上面的来获取 mainBundle
但是我看到有人用
CFBundleRef mainBundle = CFBundleGetMainBundle();
这两者有什么区别吗?
NSBundle
和CFBundleRef
不是免费桥接的,所以你不能说它们是相同的,但它们都做同样的工作并提供相同的功能。 您使用的应该只取决于您将如何在当前代码中使用它。
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.