xib和nib都是Interface Builder的图形界面设计文档,nib这个名字来自于NeXTSTEP系统,在NeXTSTEP被Apple收购之前,一直使用nib作为Interface Builder的图形文档,nib的发展经过了nib2.0,nib3.0,到NeXTSTEP被Apple收购之后,带有NeXTSTEP标志的nib被换成了xib

与nib不同的是,xib是一个XML格式的纯文本文件,而nib是一个二进制文件,xib比nib有个很明显的好处,就是xib可以很方便地进行diff操作。由于xib是文本文件,所以在版本控制和管理方面比nib更有优势。然而,不论在 Interface Builder中选择的是nib还是xib格式,Xcode编译后都将得到一个供程序运行时使用的经过编译的二进制nib文件。现在最新版本的Xcode在创建项目时,已经默认使用xib格式的文档了。

实际上,nib的生成过程就是一个序列化的过程,

nib文件的生成要经历两种序列化。

1.  IB所用的文档的序列化,序列化的结果就是这个XML文件。它保存的是所有界面的资源信息和各个对象之间的关系。

2.  编译时对这个xml文件进行的序列化,序列化的结果是二进制的nib文件。

写过IBPlugin的人应该知道,所有的控件必须支持initWithCoder和encodeWithCoder的NSCoding规范,这个就是用来被NSKeyedArchiver序列化用的。

编译时对xml文件做了如下操作

1.  读取xml文件,生成所有界面对象,生成所有object(即自定义的controller类等),设置好各个obejct之间的联系(IBAction,IBOutlet)

2.  对这一坨对象进行序列化,即调用encodeWithCoder方法来序列化,生成二进制nib文件为什么要生成二进制文件,因为从二进制文件生成类实例更快一些。

而在程序运行时,对nib文件进行反序列化的过程

运行时对nib的操作 
        1.  反序列化,调用所有对象的initWithCoder方法 
        2.  某些类的initWithFrame,init之类的方法被调用,生成所有类实例

3.  发送awakeFromNib消息,每个类实例的awakeFromNib被调用

引用《Cocoa Programming for Mac OSX》一书的说法,Interface Builder 把窗口、菜单栏以及窗口上的各种控件的对象都“冻结”在了一个 NIB文档里面了;程序运行时,这些对象将会“苏醒”。

猜测nib2.0/3.0时代的多出来的二进制文件应该就是被编译序列化之后的文件,即nib2.0/3.0的nib文件由界面信息文件和运行时二进制文件组成。 
        由以上的可以看出,凡是被拖到nib里面的对象都会被自动创建实例,无需你代码手动创建(扫盲了。。。),需要用到的话,添加一个IBOutlet即可。

关于nib加载过程,有篇文章已经写的非常好了,直接引用过来

地址:http://edsioon.me/nib%E6%96%87%E4%BB%B6%E5%8A%A0%E8%BD%BD%E6%B5%81%E7%A8%8B/

Nib文件是保存由Interface Builder创建的对象及对象间关系的一种资源文档。Nib文件中的对象包括:接口对象(可视化对象–窗口,视图,控件,菜单等;非可视化对象–窗口控制器,视图控制器,程序委托代理等)和占位符对象(File’s Owner,First  Responder,Application)。它描述了对象,以及对象间的关系。对象间的关系包括:连接Nib文件的所有者-File’s Owner,属性实例变量绑定,动作方法绑定和委托绑定。当Nib文件被加载后,接口对象被创建,占位符对象并不会被创建。应该在你的代码中创建此占位符对象,并把它传递给nib的加载代码。

1、将Nib文件内容与相关资源加载到内存

  • 将全部的Nib对象图(object graph)的原始数据加载到内存,但是数据是序列化(unarchived)的。
  • 将所有与Nib文件相关的自定义图片资源加载到内存,且被添加到Cocoa image cache。
  • 将所有与Nib文件相关的声音资源加载到内存,且被添加到Cocoa sound cache。

2、反序列化Nib对象图数据,初始化对象。每个新对象如何初始化取决于对象类型以及序列化的方式。

  • 通常情况下,对象通过initWithCoder:初始化。在iOS中,任何服从NSCoding协议的对象都通过initWithCoder方法初始化。这包括UIView和UIViewController的所有的子类,无论Xcode库的默认类还是自定义类。
  • OS X中自定义View通过initWithFrame:初始化,但是iOS中不使用此方法初始化自定义类。
  • 其他自定义对象,通过init方法进行初始化。

3、重建Nib中对象的所有的联系(action、outlet),包括与File’s Owner与其他占位对象的联系

  • outlet connections:在iOS中,nib加载代码利用setValue:forKey:重新连接outlet。在iOS中设置一个outlet会对所有的注册观察者发送一个KVO通知,这些通知有可能在所有的对象联系重建之前发出,并且肯定会发生在对象的任一awakeFromNib被调用之前。
  • action connections:在iOS中,nib加载代码会调用UIControl的addTarget:action:forControlEvents:方法来设置action。如果target参数为nil,action会由responder chain处理。

4、向Nib中相应的对象发送awakeFromNib消息。在iOS中,此消息仅发送给由nib加载代码初始化的对象,File’s Owner、First Responser、任一占位对象都接收不到awakeFromNib消息。

5、显示那些可见属性为YES的对象。

总结:
   A. 加载Nib文件->创建对象alloc->初始化init->创建对象间的连接->向创建的对象发送awakeFromNib消息。
   B. 在执行初始化init方法期间,所有的IBOutlet实例变量都为nil,只有创建了nib文件中的所有对象(包括窗口、文本编辑框、按钮…),所有连接才算完成。

C. 一旦建立了所有的连接(即对象地址连接到实例变量),会向所有的对象发送消息awakeFromNib。在awakeFromNib方法中,实例变量已连接,实例变量有效。

参考:http://blog.sina.com.cn/s/blog_6291e42d0102uww2.html

xib与nib的区别的更多相关文章

  1. iOS之nib、xib及storyboard的区别及storyboard的加载过程

    先讲述下nib, nib是3.0版本以前的产物,在终端下我们可以看到,NIB其实是一个文件夹,里面有可执行的二进制文件: 区分xib和storyboard的区别? 不同点: 1> 无论nib也好 ...

  2. 100道iOS面试题

    面试题: 1__weak什么时候用 想要在block内部变外部变量需要加__weak或者__block 2.是否使用过coreImage和coreText?如果使用过,说说你的体验(答案在另一份) 3 ...

  3. iOS中的 SB和XIB的前世今生

    今天给大家介绍一下Apple开发中三种几种常用的应用程序编写方式:纯代码创建.使用storyboard/XIB.我们都知道,纯代码编写模式适合大型项目大规模使用,利于版本管理.追踪改动以及代码合并,代 ...

  4. IOS中 类扩展 xib

    一.类扩展(class extension,匿名分类) .格式 @interface 类名 () { // 成员变量... } // 方法声明... @end .作用 > 写在.m文件中 > ...

  5. 06-联系人管理(xib应用)

    ViewController.h文件中: @interface ViewController : UIViewController - (IBAction)add:(UIBarButtonItem * ...

  6. 浅析 - Storyboard / Xib

    大家都知道纯代码写应用的成本是很高的,特别是涉及到UI界面的实现,相当耗费时间.之前自己写应用时有了解过Storyboard,也简单使用过,但随着最近深入了解它之后,发现自己低估了它的作用和影响力,因 ...

  7. IOS之UI--小实例项目--添加商品和商品名(使用xib文件终结版) + xib相关知识点总结

    添加商品和商品名小项目(使用xib文件终结版) 小贴士:博文末尾有项目源码在百度云备份的下载链接. xib相关知识点总结 01-基本使用 一开始使用xib的时候,如果要使用自定义view的代码,就需要 ...

  8. Xib的使用与File'Owner总结

    Xib的使用与File'Owner总结 一.XIB的适用范围 xib(也叫Nib)与storyboard一样是用来描述界面的. storyboard描述的是比较大型的,大范围.适合描述界面跳转等. 二 ...

  9. iOS - Xib

    前言 xib 文件可以被 Xcode 编译成 nib 文件,xib 文件本质上是一个 xml 文件,而 nib 文件就是编译后的二进制文件,该文件将视图等控件对象封装了起来,而在程序运行起来后,这些对 ...

随机推荐

  1. 通过底层AVR方法实现SPI数据传输

    主机端: /********************************* 代码功能:通过底层AVR方法实现SPI数据传输(主机端) 创作时间:2016*10*17 使用资源: 更低阶的 aTme ...

  2. css样式表 格式与布局

    1 样式表  内联样式表  内嵌样式表  外部样式表 2 选择器 标签选择器 <style type="text\css" class 选择器  以.开头 ID选择器 以#开 ...

  3. python之urllib

    简单的web应用包括使用被称为url(统一资源定位器,uniform resource locator)的web地址 这个地址用来在web上定位一个文档,或调用一个CGI程序来为你的客户端产生一个文档 ...

  4. Activity通信的第三方库——EventBus

    1.可以实现Activity之间高效的通信. 2.较好地实现了监听器和事件之间的解耦. (ps:本人觉得它实际上是一个简易的观察者模式.) 3.用法: //事件接收 public void onEve ...

  5. ELK日志管理之——logstash部署

    1.yum源配置 [root@localhost ~]# cat > /etc/yum.repos.d/logstash.repo <<EOF [logstash-1.5] name ...

  6. iOS9支付完成无法获取回调

    - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id ...

  7. NFS配置

    一,配置nfs服务端 nfs服务端IP:192.168.1.10 1,安装nfs [root@localhost ~]# yum install -y nfs-utils Loaded plugins ...

  8. IOS CoreText.framework --- 行 CTLineRef

    http://blog.csdn.net/fengsh998/article/details/8701738 前面两篇文章介绍了文字的样式,段落样式.本文章主要介绍行模式.CTLineRef 知识了解 ...

  9. Linux下cutecom使用USB转串口线

    http://www.cnblogs.com/pang123hui/archive/2011/05/29/2309888.html 在Linux下的串口调试一直使用minicom,虽说Linux的精髓 ...

  10. Ubuntu下修改hosts文件

    Ubuntu系统的Hosts只需修改/etc/hosts文件,修改完之后要重启网络.具体过程如下:1.修改hostssudo gedit /etc/hosts2.添加解析记录( . )或者从githu ...