上一章内容讲解了xib文件编译后成nib,而反过来nib文件如何加载完成页面的渲染的呢?我们来梳理一下整个过程。
nib的加载过程分析
1.将nib文件加载入内存
一种法法:通过bundle加载
[[NSBundle mainBundle] loadNibNamed:@"TestView" owner:self options:nil][0];
还有一种方法,通过nib加载
[UINib nibWithNibName:@"TestView" bundle:[NSBundle mainBundle]];
2.“解固化”并实例化出nib文件里对应的对象
即将nib对象进一步解压,生成对应的模型对象。这个过程会调用initWithCoder方法,将nib数据序列化,生产对应的模型对象,这个方法中就可以给这个对象添加子对象了。
3.建立connections(outlets、actions)
outlets与actions就是我们之前提到的建立的IBOutlet与IBAction的“连接”。建立connections的顺序是先建立outliets连接,然后建立actions连接。sourcecode中就会将两者放在<connections>标签中,nib加载到步骤3的时候就会根据这个标签去建立对应的关系。
4.调用awakeFromNib方法:
- (void)awakeFromNib {
[super awakeFromNib];
}
注意该函数只会在绑定xib的类中调用,不会在它的File's Owner及其内部的Object类中调用
5.将xib中可见的控件显示出来。
获得了所有的对象并加载所有代码逻辑后,通过calayer渲染到屏幕上。
了解整个过程后,我们也理解了为什么使用xib比代码效率相对慢一些。另外还一个需要注意的加载过程的问题,当我们使用xib加载tableview的cell的时候,一定要注意不要使用第一步中第一种NSBundle的loadNibNamed的加载,要使用第二种UINib的nibWithNibName方法加载cell。
tableview的一屏会显示多个cell,这个时候就涉及一个复用的问题,NSBundle对象无法与xib文件产生映射关系,所以每次加载cell都是读文件,而UINib对象与xib文件是映射关系,它就是内存中的xib文件,图中的两条红色箭头是理解的关键,所以我们可以通过UINib对象来达到缓存的目的,这样在tableview滚动式时,就会动态的取缓存的cell,不用频繁加载文件。