storyboard是多个xib文件集合的描述文件,也采用xml格式。
那么storyboard与xib比较,区别在于:一个工程中可以有多个xib文件,一个xib文件对应着一个视图控制器和多个视图。而使用storyboard时,一个工程只需要一个主storyboard文件就可以了。因此,在包含多个视图控制器的情况下,采用storyboard管理比较方便,而且storyboard还可以描述界面之间的导航关系。
在终端下我们可以看到,NIB 其实是一个目录。它里面有两个也是后缀为 NIB 的文件:designable.nib 和 keyedobjects.nib。前者是一个 XML 文档,而后者则是一个二进制文件。Interface Builder 3 之后,引入了新的文档格式:XIB。它是单一的 XML 文档,也就是一个纯文本文件。纯文本文件的好处是显而易见的。嗯,就是便于源代码版本管理。现在最新版本的 Xcode 在创建项目时,已经默认使用 XIB 格式的文档了。
nib的发展经过了nib2.0, nib3.0和xib.。nib2.0(nib文件夹中包含3个文件)和nib3.0(nib文件夹中包含2个文件)的文件结构相差一个二进制文件,且2.0可读性不高,不过已经很少见到这种格式了。如果你发现的你nib还是这种格式,赶紧转换吧,利用IB的Save As....
另外建议工程里面全部使用xib,如果是nib3.0,也赶紧转换吧。因为nib2.0/3.0编译后nib中包含的界面信息不会被去除,程序发布出去后别人可以打开你的nib进行编辑查看的。
xib编译后生成二进制的nib文件,这个是不可打开编辑的,所以不会暴露你的接口什么的信息,而且如果包含二进制文件的话,你的代码管理系统是不能merge or diff的。
IB运行时保存的都是object的信息,所以得进行序列化。
做过Java或者C++序列化的应该知道,你是怎么序列化的,那你就得怎么反序列化。
所以这些节点的排列顺序是有道理的。
我相信apple不会傻到直接来解析一个xml文件,xml文件应该是其序列化到文件的某一种反映形式,只要apple愿意,可以把这个文件写成任意形式。
所以拿xml文件的特点来对应nibfile的特点是不行的。当然,nib文件写成xml的格式增加了可读性,但是其很复杂,虽然每一个key都表明了它是干吗的,英语好的也能猜出来,但是其结构还是蛮复杂的,需要上下一一对应才能理解IB中资源对象的数据是什么样的。
话说一般序列化后不都是二进制文件么,为什么这里是xml格式的。恩,这就要讲到nib文件的编译和运行的原理了。
nib文件从创建,保存,编译到运行要经历两种序列化。
第一个是IB所用的文档的序列化,序列化的结果就是这个xml文件。它保存的是所有界面的资源信息和各个对象之间的关系。
第二个就是编译时对这个xml文件进行的序列化,序列化的结果就是2进制的nib文件。
写过IBPlugin的人应该知道,所有的控件必须支持initWithCoder和encodeWithCoder的NSCoding规范,这个就是用来被NSKeyedArchiver序列化用的。
编译时对xml文件做了如下操作
1,读取xml文件,生成所有界面对象,生成所有object(即自定义的controller类等),设置好各个obejct之间的联系(IBAction,IBOutlet)
2,对这一坨对象进行序列化,即调用encodeWithCoder方法来序列化,生成二进制nib文件
为什么要生成二进制文件,因为从二进制文件生成类实例更快一些。
运行时对nib的操作
1,反序列化,调用所有对象的initWithCoder方法
2,某些类的initWithFrame,init之类的方法被调用,生成所有类实例
3,发送awakeFromNib消息,每个类实例的awakeFromNib被调用
网友评论