07 (OC)* XIB原理和Xib、storyBoard、代码的优缺点
1:可读性
2:可视化界面、立马看到
3:开发速度。
4:复用性
5:维护性差
本质
编译时对xml文件做了如下操作
1,读取xml文件,生成所有界面对象,生成所有object(即自定义的controller类等),设置好各个obejct之间的联系(IBAction,IBOutlet)
2,对这一坨对象进行序列化,即调用encodeWithCoder方法来序列化,生成二进制nib文件
为什么要生成二进制文件,因为从二进制文件生成类实例更快一些。
运行时对nib的操作
1,反序列化,调用所有对象的initWithCoder方法
2,某些类的initWithFrame,init之类的方法被调用,生成所有类实例
3,发送awakeFromNib消息,每个类实例的awakeFromNib被调用
-
提取nib文件到内存中
从Bundle
中取出nib
文件,为二进制文件
,加入到内存中 -
对原xib中所有view对象进行解档
a) 从内存中的二进制数据,取出原xib
中的各view对应那部分data
b) 通过调使用initWithCoder:
初始化方法,创立原xib
中的所有view,将上面的那部分data
作为入参传入
c) 这里是每个view进行反序列化
,将二进制文件
转为实际的类。实际上不需要我们亲身来反序列化
,在initWithCoder:
方法中调使用[super initWithCoder:coder]
就可,系统的根类中已经默认做好了
d) 注意❗️:每个view(包括顶级对象view)在xib中绑定的什么类,就会创立这个类。例如一个View没有绑定类名,默认系统的UIView类,那么实际就是调使用的[UIView initWithCoder:aData]
,这个view解档完成后就是UIView的实例;假如一个View绑定类名为CustomView,那么实际就是调使用的[CustomView initWithCoder:aData]
,而后就进入到CustomView类中的initWithCoder:
方法了,这个view解档完成后就是CustomView的实例。
e) 注意❗️:在initWithCoder:
方法中,不可以用xib、SB连线出来的属性,此时连线的属性都为nil,由于现在还没开始关联属性 -
关联属性和方法
对连线到自己类
、File Owner
、Object
中的属性进行弱引使用关联,并关联事件。而后这三个地方即可以用连线过来的属性和响应连线的过来方法了。(下面会讲怎样连线到这三个地方) -
解档完成
原xib
中各个view解档完成后,调使用各自的awakeFromNib
方法,告诉你xib已经完全ok,能直接用了。现在你能在awakeFromNib
方法中,用xib、SB连线出来的属性了。
一: 纯手写代码
优点:
1: 易读性比较高,可以实现复杂逻辑功能。
2: 代码复用性非常高(前提是你提前封装过)
缺点
1: 不能所见所得,每次都要重新运行才能看到效果
2: 在制作界面的时候需要很多代码量,多的代码以为着会引入潜在的bug,写多代码也意味着浪费时间
二:使用xib开发
优点:
1: xib是苹果提供一种可视化界面开发方式,可以轻松进行拖拉控件,快速搭建一个界面。
2: 能非常清晰清楚单个界面的层次关系
3: xib复用性比较高
4: 开发速度快
缺点
1: 需求变更时,需要改变xib很大,维护性比较差
2: 在svn提交工程中非常容易造成冲突
三: 使用storyboard 故事版开发
优点:
1: storyboard是苹果在iOS5之后提供一种全新制作UI方式,他提供了非常强大界面可视化,可以快速进行拖拉界面,完成自己APP.
2:可以非常清晰看出每个控制器(View Controller)中界面逻辑关系,结构非常一目了
3: 开发速度快
缺点
1: 在开发过程中,只要点击一下storyboard,不做任何修改,SVN工具就要提醒重新提交,非常蛋疼。
2: 用过storyboard人都知道,storyboard复用性很差。
3: 在团队开发者中,极易造成冲突。