浅谈NSBundle

来源:互联网 发布:新页软件破解 编辑:程序博客网 时间:2024/05/01 11:07

   图片、xib等资源文件无法直接封入静态库,要想在静态库中使用他们,就必须借助于bundle

    那么什么是bundle呢?

    简单来说,bundle就是一个内部结构按照标准规则组织的特殊目录,即directory


    要知道,iOS的应用都是通过bundle进行封装的,对应的bundle类型是Application类型,平时我们通过XCode编译出来的Target(即我们开发的应用),其实就是一个Application类型bundle,即一个文件夹!但是Finder会把这个bundle当做一个文件显示给我们,因为这个bundle自身也是一个package,而Mac系统会把所有的package当做一个文件来对待,显示给用户,从而防止用户误操作导致程序文件损坏或丢失。在Finder中,一个应用程序看上去和其他文件没有什么区别. 但是实际上它是一个包含了nib文件,编译代码,以及其他资源的目录,我们把这个目录叫做程序的main bundle。


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


    由此可知,在国际化过程中,应用可以从bundle中读取图片、多媒体及nib界面等资源文件,那么静态库和framework也同样可以利用bundle这个特性,将其需要的资源文件存入bundle中,至于国际化过程中,为什么需要不同的nib文件,这一点也不难理解,对于同一个界面,中文和英文界面的布局有可能不会完全相同,这就需要创建多个同名的nib文件,将其放入bundle中对应的目录下。


bundle的使用:

    bundle是静态的,也就是说,我们包含到包中的资源文件作为一个资源包是不参加项目编译的。也就意味着,bundle包中不能包含可执行的文件。它仅仅是作为资源,被解析成为特定的二进制数据。

    由于是静态的,bundle使用也变得非常简单:将要使用的bundle集成到项目中,要使用bundle中的资源,只需要找到相应的资源路径,一句话:bundle玩的只是路径

[objc] view plain copy
  1. //首先找到我们的bundle文件  
  2. NSBundle *myBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource@"MyBundle" ofType :@"bundle"]];  
  3.   
  4. //获取bundle中的nib资源  
  5. ViewController1 *viewCtl1 = [[ViewController1 alloc] initWithNibName@"ViewController1" bundle: myBundle];  
  6.   
  7. //获取bundle中的图片资源  
  8. UIImage *image = [UIImage imageWithContentsOfFile: [[myBundle resourcePath]  
  9.                                                     stringByAppendingPathComponent@"0003.jpg"]]; //绝对路径法  
  10.   
  11. //或者  
  12. UIImage *image = [UIImage imageWithContentsOfFile: [myBundle pathForResource@"0003" ofType@"jpg"]];   //相对路径法  
  13.   
  14. //甚至可以...  
  15. UIImage *image1 = [UIImage imageNamed:@"MyBundle.bundle/0003.jpg"];  //纯路径法  
  16. //imageNamed方法是从mainBundle中获取资源,而此处Mybundle.bundle可以被认为是存在与mainBundle中的一个目录,这样理解该用法就比较容易了  
  17.   
  18. //获取子目录中所有类型为"JPG"的文件  
  19. NSArray *arr = [myBundle pathsForResourcesOfType@"JPG" inDirectory: nil nil];  
  20.   
  21. //当然,可以写成预编译语句:  
  22.   
  23. #define MYBUNDLE_NAME @ "MyBundle.bundle"  
  24. #define MYBUNDLE_PATH [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: MYBUNDLE_NAME]  
  25. #define MYBUNDLE [NSBundle bundleWithPath: MYBUNDLE_PATH]  

//或者方法

[objc] view plain copy
  1. #import <Foundation/Foundation.h>  
  2.   
  3. #define BUNDLE_NAME @"MyToolsWithAssetsA"  
  4.   
  5. @interface BundleTools : NSObject  
  6.   
  7. + (NSString *)getBundlePath: (NSString *) assetName;  
  8. + (NSBundle *)getBundle;  
  9.   
  10. @end  

[objc] view plain copy
  1. #import "BundleTools.h"  
  2.   
  3. @implementation BundleTools  
  4.   
  5. + (NSBundle *)getBundle{  
  6.       
  7.     return [NSBundle bundleWithPath: [[NSBundle mainBundle] pathForResource: BUNDLE_NAME ofType@"bundle"]];  
  8. }  
  9.   
  10. + (NSString *)getBundlePath: (NSString *) assetName{  
  11.       
  12.     NSBundle *myBundle = [BundleTools getBundle];  
  13.       
  14.     if (myBundle && assetName) {  
  15.           
  16.         return [[myBundle resourcePath] stringByAppendingPathComponent: assetName];  
  17.     }  
  18.       
  19.     return nil;  
  20. }  
  21.   
  22. @end  

有一点需要注意:

既然有绝对路径法可以获取bundle中的资源,为什么还要有相对路径法呢?

    正如我们前面所讲,bundle对iOS开发者来讲,最大的方便就是可以非常简单地让自己的应用国际化,在不同的语言不同的地区,加载不同的资源文件,显示不同的语言文字,而实现这些只需要我们严格按照bundle的要求进行资源文件的存放即可,不需要写大量代码判断地区语言。如果我们使用文件系统的绝对路径法,当需要App国际化的时候,就只能自己去实现不同语言、不同地区的情况下加载对应的文件,如果有部分资源文件公用,部分需要国际化,那么此时,对开发人员来讲,代码维护起来将会是一场灾难。所以,我们要尽量去选用相对路径法加载资源。




阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 3u怎么办网上值机 快2下车忘了刷卡怎么办 老公搜附近的人怎么办 做了不该做的事怎么办 住酒店不退押金怎么办? 飞猪订单删除了怎么办 跟团去瑞士签证怎么办 联系不上快递员怎么办 煮过鱼汤的鱼怎么办 熬完鱼汤的鱼怎么办 炖鱼汤剩的鱼怎么办 吃了没煮熟的鱼怎么办 没熟的猪肉吃了怎么办 吃了没熟的鱼怎么办 自考怎么办免考英语2 怎么办龙唐大厦游泳卡 战地4下载等候中怎么办 微信红包限额了怎么办 玉琨学校毕业后怎么办 泡温泉不想素颜怎么办 身份证过期1个月怎么办 工作时被同事骂怎么办 骗了感情骗了钱怎么办 别人老骂我胸小怎么办 别人说你没素质怎么办 我的12306忘了怎么办 电工证6年过期怎么办 电工证复审过2年怎么办 电工证过期2个月怎么办 如果报到证丢了怎么办 考编报到证丢了怎么办 2017报到证丢了怎么办 携程机票不能退怎么办 暗黑3进度全没了怎么办 从飞机上掉下来怎么办? 白带多有酸臭味怎么办 私募基金跑路了怎么办 车险的保单丢了怎么办 做的3d有病毒怎么办 猫吐白沫没精神怎么办 光伏发电坏了怎么办