xib与nib的区别
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的区别的更多相关文章
- iOS之nib、xib及storyboard的区别及storyboard的加载过程
先讲述下nib, nib是3.0版本以前的产物,在终端下我们可以看到,NIB其实是一个文件夹,里面有可执行的二进制文件: 区分xib和storyboard的区别? 不同点: 1> 无论nib也好 ...
- 100道iOS面试题
面试题: 1__weak什么时候用 想要在block内部变外部变量需要加__weak或者__block 2.是否使用过coreImage和coreText?如果使用过,说说你的体验(答案在另一份) 3 ...
- iOS中的 SB和XIB的前世今生
今天给大家介绍一下Apple开发中三种几种常用的应用程序编写方式:纯代码创建.使用storyboard/XIB.我们都知道,纯代码编写模式适合大型项目大规模使用,利于版本管理.追踪改动以及代码合并,代 ...
- IOS中 类扩展 xib
一.类扩展(class extension,匿名分类) .格式 @interface 类名 () { // 成员变量... } // 方法声明... @end .作用 > 写在.m文件中 > ...
- 06-联系人管理(xib应用)
ViewController.h文件中: @interface ViewController : UIViewController - (IBAction)add:(UIBarButtonItem * ...
- 浅析 - Storyboard / Xib
大家都知道纯代码写应用的成本是很高的,特别是涉及到UI界面的实现,相当耗费时间.之前自己写应用时有了解过Storyboard,也简单使用过,但随着最近深入了解它之后,发现自己低估了它的作用和影响力,因 ...
- IOS之UI--小实例项目--添加商品和商品名(使用xib文件终结版) + xib相关知识点总结
添加商品和商品名小项目(使用xib文件终结版) 小贴士:博文末尾有项目源码在百度云备份的下载链接. xib相关知识点总结 01-基本使用 一开始使用xib的时候,如果要使用自定义view的代码,就需要 ...
- Xib的使用与File'Owner总结
Xib的使用与File'Owner总结 一.XIB的适用范围 xib(也叫Nib)与storyboard一样是用来描述界面的. storyboard描述的是比较大型的,大范围.适合描述界面跳转等. 二 ...
- iOS - Xib
前言 xib 文件可以被 Xcode 编译成 nib 文件,xib 文件本质上是一个 xml 文件,而 nib 文件就是编译后的二进制文件,该文件将视图等控件对象封装了起来,而在程序运行起来后,这些对 ...
随机推荐
- 第一次正式小用Redis存储
由于要做一个同一个页面上多种图表数据的下载,考虑到Azure上面的session很不稳定(可用Redis provider存储session,较稳定),故决定改为Azure支持的Redis,顺便也学习 ...
- Asp.Net MVC4入门指南(2):添加一个控制器
MVC代表: 模型-视图-控制器 .MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据 ...
- php 生日提醒程序
<?php $startdate=time(); //当前时间 $birth="2013-05-13"; // 出生日期 $arr=explode(" ...
- 云计算和大数据时代网络技术揭秘(十三)VXLAN
Vxlan(virtual Extensible LAN)虚拟可扩展局域网,是一种Overlay方式的网络技术,采用了mac in UDP的方式 进行封装,共50字节的报头.该技术的目标是解决虚拟机在 ...
- 360极速浏览器UA怪异以及如何用js判断360浏览器
本文最后一次更新于7个月前,文章内容可能略有出入.若发现文章中有错误之处,可以留言评论告诉作者. 1.360极速浏览器UA因域名不同而异 今天在写一个判断浏览器.浏览器版本.操作系统.操作系统版本.浏 ...
- 递推 N矩形问题
Description 给你一个高为n ,宽为m列的网格,计算出这个网格中有多少个矩形,下图为高为2,宽为4的网格. Input 第一行输入一个t, 表示有t组数据,然后每行输入n,m,分别表示网格的 ...
- 理解RHEL上安装oracle的配置参数
无论安装什么版本的oracle,在安装之前,都需要配置 /etc/pam.d/login /etc/profile /etc/security/limits.conf这三个文件 那这三个文件究 ...
- c# XML序列化与反序列化 属性字段标识
序列化对象 public class People { [XmlAttribute("NAME")] public string Name { set; get; } [XmlAt ...
- JS判断手机访问跳转到手机站
这里提供了六种让手机端访问网站跳转到手机端的方法: 第一种: <script> if(navigator.platform.indexOf('Win32')!=-1){ //pc //wi ...
- 数据库知识整理<四>
使用DML语句更改数据: 所谓DML语句是指数据库操作语句,其中包括的是对数据库数据的修改.删除.插入. 4.1添加新数据: 插入单行的记录:基本的SQL语句为-insert into <表明& ...