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

时间: 2024-10-18 07:05:47

xib与nib的区别的相关文章

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

先讲述下nib, nib是3.0版本以前的产物,在终端下我们可以看到,NIB其实是一个文件夹,里面有可执行的二进制文件: 区分xib和storyboard的区别? 不同点: 1> 无论nib也好,xib也好,最终在执行UIViewController生命周期函数loadView之前,都会转化成可执行的nib文件. 2> storyboard是多个xib文件集合的描述文件,一个xib文件对应着一个视图控制器和多个视图. toryboard时,一个工程只需要一个主storyboard文件就可以.

IOS xib 和storyboard的区别

1.xib的基础知识: 1).xib = nib: 2).xib的加载: [[NSBundle mainBundle] loadNibName:@"rowView" ower:nil options:nil]; 2.xib 和storyboard 的异同: 1>.不同 *storyboard:描述软件界面,大范围,重量级,比较适合描述整个软件的所有界面: *xib:描述软件界面,小范围,轻量级,比较适合描述小界面(局部界面): 2>.相同:本质都是转成代码 3.File's

iOS之nib、xib及storyboard的区别

我们经常可以听到nib开发或xib开发之类的术语,但两者有什么区别呢?其实两者说的意思差不多. nib是3.0版本以前的产物,在终端下我们可以看到,NIB其实是一个文件夹,里面有可执行的二进制文件: xib是一个基于xml的描述文件,可以实现可视化编程. 无论nib也好,xib也好,最终在执行UIViewController生命周期函数loadView之前,都会转化成可执行的nib文件. storyboard是多个xib文件集合的描述文件,也采用xml格式. 那么storyboard与xib比较

xib和storyboard的区别

storyboard: 重量级 用来描述整个App的多个软件 User Interface -> Storyboard xib: 轻量级 用来描述一个界面,通常是自定义控件 User Interface -> Empty 打包之后叫nib 使用时没有设置尺寸,默认为xib描述的尺寸 加载xib的方式: 常用: UIView * nibView = [[[NSBundle mainBundle] loadNibNamed:@"nibName" owner:nil option

【iOS开发-48】九宫格布局案例:自动布局、字典转模型运用、id和instancetype区别、xib重复视图运用及与nib关系

本次九宫格案例: (1)导入app.plist和各种图片素材,方便后续开发.实际开发中,也是如此. (2)把plist中数组导入进来. --因为本案例中app.plist最终是一个数组,数组里面是字典.所以我们需要一个数组类型来接受这个plist文件. --我们利用之前掌握的在变量的getter中进行延迟加载数据. #import "ViewController.h" @interface ViewController () @property(nonatomic,strong) NS

iOS中的 SB和XIB的前世今生

今天给大家介绍一下Apple开发中三种几种常用的应用程序编写方式:纯代码创建.使用storyboard/XIB.我们都知道,纯代码编写模式适合大型项目大规模使用,利于版本管理.追踪改动以及代码合并,代码重用性强,代码后期维护方便快捷.但是我们不能否认它开发周期长,代码结构复杂,自动布局AutoLayout困难等缺点, 一.Interface Builder介绍 1.概念 Interface Builder苹果平台下用于设计和测试用户界面的应用程序,简称IB.简单理解,IB就是提供可视化设计环境.

UI基础xib的使用及xib的封装

一: 1.xib和stroryboard Storyboard 描述软件界面,相对于xib比较重量级,一个stroryboard可以有多个场景.可以描述整个软件的所有界面 xib 描述软件界面,一般用来描述一个界面中的某一个部分 本质就是代码创建的 xib的加载过程,从xml中加载进来对界面的描述,并以此创建出来 JSAppView *view = [[JSAppView alloc] init]; View.frame = CGRectMake(0,0,85,90); UIImageView

IOS中 类扩展 xib

IOS中 类扩展 xib 一.类扩展(class extension,匿名分类) 1.格式 @interface 类名 () { // 成员变量... } // 方法声明... @end 2.作用 1> 写在.m文件中 2> 一般用来扩充私有成员变量.@property属性.方法等 二.随机数生成 1.arc4random() 会生成任意正整数和0 2.arc4random_uniform(100) 会生成0~99的整数(包括0和99) 三.UIView常见方法 1.addSubview:(U

使用xib开发界面

纯代码写界面有时候会降低开发效率,对于一些通用简单的界面,例如程序设置界面,可以使用xib进行开发.一.关于xib 1. xib和nib xib文件可以被Xcode编译成nib文件,xib文件本质上是一个xml文件,而nib文件就是编译后的二进制文件,该文件将视图等控件对象封装了起来,而在程序运行起来后,这些对象会被激活. xib文件本质上是一个xml文件,可以用vim或cat命令查看,例如: $ cat ~/Desktop/JLN-1_xib/JLN-1_xib/GrayViewControl