[NSBundle bundleForClass:[self class]]]这是什么意思?

时间:2017-05-03 07:43:18

标签: ios objective-c cocoapods

我现在正在创建cocoapod库。如果我想加载json,png和其他xib文件,我需要使用[NSBundle bundleForClass:[self class]]]而不是使用主bundle。我想知道这种推荐方式是这样做的,这是什么意思?

2 个答案:

答案 0 :(得分:2)

Apple使用捆绑包来表示应用程序,框架,插件以及许多其他特定类型的内容。 Bundles将其包含的资源组织到定义良好的子目录中,并且bundle结构根据平台和bundle的类型而有所不同。

BeanUtils.copyProperties(user, UserHist); saveAndFlush(User); saveAndFlush(UserHist); 为您提供给定类的包。

例如:

-[NSBundle bundleForClass:]

在AppController AwesomeApp: AppController FrameworkA: FrameController 中调用将返回AwesomeApp.app包。在-[NSBundle bundleForClass:[self class]]内,它会返回FrameController -

答案 1 :(得分:2)

  

捆绑包是macOS和iOS中的基础技术   封装代码和资源。捆绑包简化了开发人员   通过为所需资源提供已知位置的经验   减少了创建复合二进制文件的需要。相反,捆绑   使用目录和文件来提供更自然的类型   组织 - 在一段时间内也可以轻松修改的组织   开发和部署后。

Xcode项目可以包含多个目标,这些目标本身可能包含不同的文件(例如资产文件或某些来源/配置等)。

这样您就不必在所有目标中打包所有文件,但可以区分。 特别是对于测试,这是一个很好的方法,因为您可以提供某些测试文件/资源​​/“无效”文件来测试您的代码。 因为您确实测试了mainBundle中的大部分时间代码(基本上是您的应用程序,将提供),但也使用资产或其他不属于您的应用程序中的数据包。

如果您愿意(并且您可能会偶然发现这个!)使用此功能,您将需要从另一个包中加载某个文件。

所以,你将无法使用

[[NSBundle mainBundle] pathForResource:@"tests" ofType:@"plist"]

但是会在你的测试包中使用你的XCTTestCase-Class:

// https://developer.apple.com/reference/foundation/bundle
[[NSBundle bundleForClass:self.class] pathForResource:@"tests" ofType:@"plist"]

https://developer.apple.com/library/content/documentation/CoreFoundation/Conceptual/CFBundles/AccessingaBundlesContents/AccessingaBundlesContents.html

如果您真的想了解有关Bundles的更多信息,请参阅此链接: https://developer.apple.com/library/content/documentation/CoreFoundation/Conceptual/CFBundles/Introduction/Introduction.html#//apple_ref/doc/uid/10000123i

它们非常强大且实用,所以请花点时间: - )