浅谈Nib文件的Load过程
iOS官方文档极力推荐大家使用Nib开发程序的UI,也就是Interface Builder方式开发,这种开发模式相对代码实现的好处就是所见即所得,便于及时的调整。
这里主要谈两点:Nib文件的load过程和load方法。
Nib文件的load过程
根据iOS开发文档Resource Programming Guide的描述,Nib文件的load包含以下过程:
1.将Nib文件从磁盘载入内存,有两种技术可以加载Nib文件:NSBundle和UINib,具体细节会在第二节中描述。
2.执行unarchive和initialize操作,该过程主要由NSCoding Protocol中的initWithCoder:(NSCoder *)decoder完成。
3.建立connections:Outlets和Actions。Outlets使用IBOutlet关键字标示,使用setValue:forKey:方法建立每个Outlet,所以每个Outlet的建立都会发送KVO通知。Actions使用IBAction关键字标示,替换void返回值,通过调用addTarget:action:forControlEvents:方法建立每个Action连接。注意,这里构建Outlets和Actions是有先后顺序的,先建立Outlets连接,随后建立Actions连接。因为,Actions的建立依赖之前建立的Outlets。
4.调用awakeFromNib方法,首先要调用super的awakeFromNib方法,之后可以设置一些个性化的操作,以及一些无法在设计时设定的操作。注意,awakeFromNib消息只发往在Interface Builder中指定的Custom Class,不会发送给Files's Owner,First Responder等占位对象。
之后,该对象的load完成,可以进行各式各样的操作了。
Load方法
iOS提供了两种load nib文件的技术:NSBundle和UINib。NSBundle的应用场景更为广泛,除了支持Nib文件的载入,也支持image, sound, video, plist等文件的载入。UINib的途径更为单一,只用来载入Nib文件。
NSBundle每次都从磁盘上load Nib文件,之后执行上面描述的Nib文件的load过程,而UINib则只是第一次从磁盘上载入Nib文件,之后将Nib文件缓存在内存中,每次新生成一个对象时,直接访问内存中的Nib文件执行上面描述的2-4步,所以性能上会有很大的提升,并且开发者文档也建议对于那些重复使用的Nib文件使用UINib load技术,比如作为UITableViewCell的subView。有同学可能会有这样的疑问:会不会消耗过多的内存,导致low memory warning的问题,Apple的工程师考虑的很周到,注意到了这个问题,UINib技术支持响应low memory warning,当收到该警告时,会从内从中卸载Nib文件,当再次访问的时候会从磁盘中载入。
iOS开发文档建议多次重用的Nib文件使用UINib load技术,我建议可以更激进一些,所有的Nib文件的load都可以使用UINib技术,毕竟性能上优势很大,从内从访问和从磁盘访问可是数量级的差别。同时,由于支持低内存时自动卸载Nib文件,所以相当的自动化,因此强烈建议使用UINib载入Nib文件。