@NSBundle包,是一种特定的文件类型,一个主要作用是获取Resources文件中的资源
bundle是一个目录,其中包含了程序会使用的资源,这些资源包含了如图像、声音、编译好的代码、nib文件;cocoa提供了一个类NSBundle。我们的程序是一个bundle。在finder中,一个应用程序看上去和其他文件没有什么区别,但是实际上它是一个包含了nib文件、编译代码、以及其他资源的目录。我们把这个目录叫做程序的main bundle。
[NSBunde mainBundle]是获得NSBundle的一个单例对象,它已经设置了默认的resourcePath,也就是你的app打包后的路径,[[NSBundle mainBundle] resourcePath]就是获得完整的打包后的app路径。
iOS程序有自己的文件访问机制,只能在自己的沙盒内。
UIImage * img = [UIImage imageNamed:@"icon.png"];
这段代码从相对路径加载了一个png图片资源作为UIImage对象,没有任何问题。因为它在内部已经偷偷把路径转化为相对路径了。
接下来,如果要加载一些自定义格式的文件或者数据,就会出现相对路径和绝对路径的问题。
NSFileHandle * fileHandle = [NSFileHandle fileHandleForReadingAtPath:@"test.txt"];
这样系统是找不到文件的,因为这里要的是文件的绝对路径。这个时候就需要NSBundle了,这个类专门用来负责路径转化等功能。iOS项目虽然在Xcode下可以创建文件夹结构,但是实际上它是没有文件结构的概念的,那我们要加载这种文件,完整的代码应该是这样:
方法1:
NSString * newPath = [NSString stringWithFormat:@"%@%@%@",[[NSBundle mainBundle] resourcePath],@"/",path];
NSFileHandle * filePath = [NSFileHandle fileHandleForReadingAtPath:newPath];
方法2:
NSString * newPath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"txt"];
NSFileHandle * filePath = [NSFileHandle fileHandleForReadingAtPath:newPath];
这里就知道NSBundle的作用了。
Xib文件的加载:
1: NSArray * xibArr = [[NSBundle mainBundle] loadNibNamed:@"XXXXIdentifier" owner:nil options:nil];
这个方法会创建xib中的所有对象,并且降对象放在objs数组中,
2:UINib* nib = [UINib nibWithNibName:@"XXXXIdentifier" bundle:[NSBundle mainBundle]];
NSArray * objs = [nib instantiateWithOwner:nil options:nil];
xib文件编译成功就是nib文件,它比我们用代码自定义控件节省两个步骤:1、初始化;2、在layoutSubviews中设置frame。
xib的加载过程:首先调用-(instancetype)initWithCoder:(NSCoder *)aDecoder而不是调用initWithFrame方法,之后调用- (void)awakeFromNib,控件初始化都应该写在这里