iOS 编码复习(十)—— NSBundle文件与nib文件

@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,控件初始化都应该写在这里




你可能感兴趣的:(ios,文件,沙盒)