bundle 文件的理解
mian bundle
文件说明
参考:IOS开发NSBundle对象使用详解 https://my.oschina.net/u/874588/blog/98342
应用程序就是是一个 bundle
在Finder中,一个应用程序看上去和其他文件没有什么区别,但是实际上它是一个包含了nib文件,编译代码,以及其他资源的目录. 我们把这个目录叫做程序的 main bundle
。也就是说,我们获取的 NSBundle mainBundle
就是我们的 应用程序
,或者说应用程序的 根目录(rootFolder)
注意
在工程中我们可能会自己建立一个
main.bundle
文件,但不是上面说到的资源目录main bundle
文件参考:
NSBundle的使用,注意mainBundle和Custom Bundle的区别 http://www.cnblogs.com/iihe602/archive/2013/01/17/2865280.html
1,获取应用程序 main bundle
文件
NSBundle *myBundle = [NSBundle mainBundle];
2,获取资源文件下的 .bundle
文件
如:source.bundle
如果想获取到资源目录(main bundle
)下的 bundle
文件,比如 source.bundle
文件,首先要进入到应用程序 main bundle
目录下
// 获取 main bundle 目录
NSBundle *mainBundle = [NSBundle mainBundle];
// 获取 main bundle 路径
NSString *mainPath = [mainBundle resourcePath];
NSLog(@"mainPath 路径: %@", mainPath);
mainPath 路径:
/Users/yang_0921/Library/Developer/CoreSimulator/Devices/7FFAA7A9-7B04-4681-B9CB-838EA92A2829/data/Containers/Bundle/Application/30737520-1371-4CCF-9E9F-805BC414A5F6/bundle.app
在拼接 main.bundle
路径
NSString *sourcePath = [mainPath stringByAppendingPathComponent:@"source.bundle"];
sourcePath:
/Users/yang_0921/Library/Developer/CoreSimulator/Devices/7FFAA7A9-7B04-4681-B9CB-838EA92A2829/data/Containers/Bundle/Application/55081882-2121-4FBC-8E9E-C38332D58489/bundle.app/source.bundle
获取 source.bundle
文件
NSBundle *sourceBundle = [NSBundle bundleWithPath:sourcePath];
sourceBundle:
</Users/yang_0921/Library/Developer/CoreSimulator/Devices/7FFAA7A9-7B04-4681-B9CB-838EA92A2829/data/Containers/Bundle/Application/55081882-2121-4FBC-8E9E-C38332D58489/bundle.app/source.bundle> (not yet loaded)
到这里,我们就成功的获取到了 source.bundle
文件。
接着,获取 source.bundle
中的图片
NSString *imagePath = [sourceBundle pathForResource:@"sample" ofType:@"png"];
UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
self.imageView.image = image;
3,获取 .bundle
子目录下的图片
如果要获取上面截图中的 source.bundle/sub
文件夹下的 sample@3x.png
图片,需要进入到 sub
文件夹下访问,通过 sub/xxx
的方式
NSString *imagePath = [sourceBundle pathForResource:@"sub/sample@3x" ofType:@"png"];
// NSString *imagePath = [sourceBundle pathForResource:@"sample@3x" ofType:@"png" inDirectory:@"sub"];
UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
本地资源目录下获取文件时,可以不使用
/sub
或inDirectory:@"sub"
去指定详细的文件位置,这是因为:编译之后,mainBundle的资源都是放到RootFolder下,所以,可以直接访问,不要指定内部路径。但是自定义的bundle
文件是不同的。具体参考:
NSBundle的使用,注意mainBundle和Custom Bundle的区别 http://www.cnblogs.com/iihe602/archive/2013/01/17/2865280.html
bundle
的其他用途
1,获取 nib
文件
通过 bundle
获取 nib
文件
SourceView *view = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([SourceView class]) owner:nil options:nil] firstObject];
NSLog(@"view = %@", view);
view = <SourceView: 0x7fbabee0d150; frame = (0 0; 375 667); autoresize = W+H; layer = <CALayer: 0x600000034f00
一个思考
在我们使用
nib
文件自定义table view cell
的时候,通常通过下面方法注册cell
,其中使用[UINib nibWithNibName:NSStringFromClass(className) bundle:nil]
获取nib
文件[tableView registerNib:[UINib nibWithNibName:NSStringFromClass(className) bundle:nil] forCellReuseIdentifier:@"cellId"];
这个方法中最后一个参数
bundle:
是否可以是在我们自动的source.bundle
下的文件?
查看文档说明:
bundle
是我们要获取nib
的目录,nil
为[NSBundle mainBundle]
,说明可以获取bundle
中的nib
文件。尝试
但是头文件并不能够访问的到
使用 @class TableViewCell;
运行
报错:不能够加载 source.bundle
下的 TableViewCell
所以,暂时还不知道如何实现???
2,bundle中可以包含一个库. 如果我们从库得到一个class, bundle会连接库,并查找该类
Class newClass = [[NSBundle mainBundle] classNamed:@"test"];
id newInstance = [[newClass alloc] init];
如果不知到class名,也可以通过查找主要类来取得(我没有实验成功)
Class aClass = [[NSBundle mainBundle] principalClass];
id anInstance = [[aClass alloc] init];
3,获取本地目录下的文件内容,获取到路径之后,通过对于的方法获取
一般格式:
// 获取XML文件
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"re" ofType:@"xml"];
NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];
// [NSData dataWithContentsOfFile:<#(nonnull NSString *)#>]
// 获取字典
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"ViewControllers" ofType:@"plist"]];
// 获取数组
[NSArray arrayWithContentsOfFile:<#(nonnull NSString *)#>]