陈斌彬的技术博客

Stay foolish,stay hungry

Objective-c Bundle简介

[[NSBundle mainBundle] pathForResource:@"someFileName" ofType:@"yourFileExtension"]; 
[YourViewController initWithNibName:"YourViewController" bundle:nil];

Bundle 简单地讲,就是一个内部结构按照标准规则组织的特殊目录

iOS 的应用都是通过 bundle 进行封装的,对应 的bundle 类型是 Application 类型,平时我们通过 XCode 编译出来的 Target(即我们开发的应用),其实就是一个 Application 类型 bundle,即一个文件夹!但是 Finder 会把这个 bundle 当做一个文件显示给我们,其实是因为这个 bundle 自身也是一个 package,而 Mac 系统会把所有的 package 当做一个文件来对待,显示给用户,从而防止用户误操作导致程序文件损坏或丢失。至于 bundle 和 package 有什么区别,就不在这里展开说明了,本文后面所说的 bundle 都会被 Mac 系统视为 package。

现在我们已经知道了,原来我们开发的应用程序,最后都会成为一个 bundle,那么就不难理解为什么很多资源文件加载大多是通过 bundle 来进行的了,从 bundle 进行文件加载实际就是通过应用自己所在的文件夹进行加载。

不过紧接着我们又会产生好几个疑问:

  1. 为什么不直接使用文件路径的方式来读取资源文件呢?
  2. 为什么还会存在 pathForResource:ofType: 这个方法,难道说我们在开发的时候还不能确定这些文件在哪儿吗?

事实上,我们是可以使用文件系统的路径进行资源文件的访问的,不过当我们要进行 App 的国际化的时候,我们需要自己去实现不同语言、地区情况下加载对应的文件,而在部分资源文件公用,部分需要国际化的时候,对开发人员来讲,代码维护起来尤为混乱。

而 bundle 对 iOS 开发者来讲,最大的方便就是可以非常简单地让自己的应用国际化,在不同的语言不同的地区,加载不同的资源文件,显示不同的语言文字,而实现这些只需要我们严格按照 bundle 的要求进行资源文件的存放即可,而不需要写大量代码判断地区语言。遵循的方法也很简单,只需要我们创建对应的"本地化文件夹"即可,例如我们要同时让图片 "pic.png" 在中文和英文下显示不同的内容,只需要创建两个本地化文件夹 zh.lprojen.lproj,分别放入同名但内容不同的 "pic.png" 即可。