我现在正在创建cocoapod库。如果我想加载json,png和其他xib文件,我需要使用[NSBundle bundleForClass:[self class]]]
而不是使用主bundle。我想知道这种推荐方式是这样做的,这是什么意思?
答案 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"]
如果您真的想了解有关Bundles的更多信息,请参阅此链接: https://developer.apple.com/library/content/documentation/CoreFoundation/Conceptual/CFBundles/Introduction/Introduction.html#//apple_ref/doc/uid/10000123i
它们非常强大且实用,所以请花点时间: - )