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方法中,实例变量已连接,实例变量有效。

xib与nib的区别相关推荐

  1. Xib与Nib区别联系

    1.前端渲染/SDK指令不受客户端控制 2.Xcode中很多配置文件其实是html5类前端风格文件可视化呈现. 3.InterfaceBuilder界面编译器交互环境可视化,xib与nib为界面编译器 ...

  2. iOS之nib、xib及storyboard的区别

    nib是3.0版本以前的产物,在终端下我们可以看到,NIB其实是一个文件夹,里面有可执行的二进制文件: xib是一个基于xml的描述文件,可以实现可视化编程. 无论nib也好,xib也好,最终在执行U ...

  3. 关于 XIB 和 NIB

    NIB 和 XIB 的区别与联系 NIB 和 XIB 都是 Interface Builder 的图形界面设计文档.引用<Cocoa Programming for Mac OSX>一书的 ...

  4. iOS组件化中xib转nib

    有的小姐姐小哥哥比较喜欢用xib,或者当我们的业务状态非常多的时候,可以利用xib+UIStackView来迅速开发,都知道大量的xib会非常的耗性能,但是偶尔一两个也是可以的. 我是一个偏向于代码布 ...

  5. Xib和StoryBoard的区别

    共同点: 都是用来描述软件界面 都用Interface Builder工具来编辑 本质都是转换成代码去创建控件 不同点: Xib是轻量级的,用来描述局部 UI界面 Xib文件通过里边部件的下标来添加元 ...

  6. 100道iOS面试题

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

  7. xib的简单介绍与使用

    1> 什么是xib? xib能做什么? * 用来描述软件界面的文件. * 如果没有xib,所有的界面都需要通过代码来手动创建. * 有了xib以后,可以在xib中进行可视化开发,然后加载xib文 ...

  8. Framework 动态库加载 xib

    Framework 无法直接使用 xib , 在项目中xib编译过后会产生一个nib的文件 所有需要把xib 转换为nib 使用命令把 xib 转行为nib ibtool --errors --war ...

  9. ios开发-UI基础-应用管理(单纯界面)

    功能分析 以九宫格的形式展示应用信息 点击下载按钮后,做出相应操作(弹出一个提示"正在下载",相应应用的下载按钮变为"已下载") 步骤分析 搭建UI界面 加载应 ...

最新文章

  1. 对标Bert?刷屏的GPT 2.0意味着什么
  2. Hive学习之七《 Sqoop import 从关系数据库抽取到HDFS》
  3. dataGridView1去掉第一列
  4. e.getMessage 为空NULL
  5. Codeforces-449B-Jzzhu and Cities(最短路变形)
  6. 启明云端分享| ESP32-C6有啥特别之处呢?性能如何,搭载的处理器是什么呢?GPIO有多少个呢?采用的框架是什么呢?
  7. COM+在win2003+IIS+MSSQL环境下的部署步骤
  8. OO第四单元博客作业
  9. 惊现试衣间照片流出??
  10. 小学奥数_7832 最接近的分数 python
  11. Visualvm 远程测试 问题
  12. Python:使用threading模块实现多线程编程三[threading.Thread类的重要函数]
  13. 『ORACLE』Oracle GoldenGate搭建(11g)
  14. OpenGL学习之旅(三)——Bezier曲线理论与OpenGL实现
  15. 半导体二极管的伏安特性和电流方程
  16. IRP IO_STACK_LOCATION 《寒江独钓》内核学习笔记(1)
  17. 京东商品长图功能来啦 不用改图一键生成长图
  18. 人工神经网络预测血药浓度计算公式
  19. uniapp 自定义弹层时,底部页面滚动而弹层不能滚动
  20. sugar与阿龙的互怼(第一季)

热门文章

  1. 中国科学:中科院遗传发育所揭示拟南芥二半萜对根系微生物组的调控机制
  2. R语言使用timeROC包计算存在竞争风险情况下的生存资料多时间AUC值、使用cox模型、并添加协变量、可视化存在竞争风险情况下的生存资料多时间ROC曲线
  3. Warning in install.packages : package ‘RGtk2’ is not available for this version of R
  4. R语言可视化包ggplot2包移除可视化图形的轴标签(刻度及其对应数值)实战(Remove Axis Labels)
  5. java测试时间的类,java 测试五种单例模式需要的时间
  6. 一键编译php,编译安装php 附加一键安装php5.6.30脚本
  7. RNA-Seq Transcriptome Profiling Identifies CRISPLD2 as a Glucocorticoid Responsive Gene that Modulat
  8. access mysql字段对应_ACCESS数据库中表与字段名称修改
  9. java 庖丁解牛api_Java Restful API Best Practices
  10. ajax更新,AJAX网址更新(AJAX URL update)