nib 加载过程分析以及对File’s Owner的理解
nib loading的过程,这个是app文档里面有说到资源编程指南
1.
It loads the contents of the nib file and any referenced resource files into memory。将nib文件和其中引用到的资源文件加载到内存中。
2.It unarchives the nib object graph data and instantiates the objects。
解析nib对象,并对其进行实例化。对实例的对象初始化规则.
a .By default, objects receive an
initWithCoder:
message.默认调用initWithCoder:.对于所有遵循NSCoding协议的对象,包括UIView和UIViewController的子类都会调用这个方法。
b.Custom views in iOS do not use the
initWithFrame:
method for initialization.
这针对于OS X。iOS的自定义view没有这个方法。所以这里忽略。
c.Custom objects other than those described in the preceding steps receive an
init
message. 也就是其他对象将会调用init方法。
3. It reestablishes all connections (actions, outlets, and bindings) between objects in the nib file。重新为nib文件中的对象简历连接。包括placeholder对象的链接。
outlet的链接。In iOS, the nib-loading code uses the
setValue:forKey:
method to reconnect each outlet。iOS中使用的的mvc机制对其进行操作。
Action connections。in iOS, the nib-loading code uses the
addTarget:action:forControlEvents:
method of the
UIControl
object to configure the action. If the target is
nil
, the action is handled by the responder chain.使用的是addTarget:action:forControlEvents进行关联。如果目标是nil。那么这个action将会被相应链处理
Bindings。iOS不支持这个
4.It sends an
awakeFromNib
message to the appropriate objects in the nib file that define the matching
selector
:
In iOS, this message is sent only to the interface objects that were instantiated by the nib-loading code. It is not sent to File’s Owner, First Responder, or any other placeholder objects.这个消息只会发送给再nib loading过程中实例化的对象,而不会给placeholder objects发送这个消息。
5. It displays any windows whose “Visible at launch time” attribute was enabled in the nib file.
下面主要是分析connect的具体建立过程。
我们再xib中拖拽,不管是File's Owner还是再Object中进行的。都会再xib文件中保持这种链接关系。
这个是再object中建立的connect。其中包含有链接的源和目的目标,这个分别用ref做的标记。还有一个label,这就是我们的IBOutLet的名称了。
通过上面的xib的代码可以知道这个链接是和cell关联的,而不是和file‘s owner关联的。
下面再来看看和File’s owner关联的
看到了吧。其实你拖拽的链接关系都记录在了xib中了。再补充一个就是自定义类,很多时候我们都是要使用我们自定义的类。这个是再下面的图里面进行了描述。
到这里就差不多理解,nib再加载过程中是如何生成我们需要的对象,以及如果将IBOutLet和IBAction关联起来的了吧。细心的人可能注意到了File‘s Owner这个东西了,
那么这个对象又扮演着什么样的角色呢?
File's Owner是控制对象,可以说是nib文件的所有者,控制管理可视化对象。
这个和使用代码loadNibNamed中的owner是一样的意思。File's Owner作为占位符,是需要提前再使用nib加载之前存在的。我们一般将File‘s Owner设置为我们自己的Controller类,然后使用initWithNib来生成我们的Controller对象。其实 UIViewController是采用延迟加载的方式,只要需要使用view的时候才会真正的将nib加载起来,这个使用其实底下用的还是
NSBundle
的loadNibNamed这个方法,此时owner就是UIViewController了。这样我们在建立connect的时候就有了对象了。
除了File’s Owner作为那些使用File‘s Owner建立链接必须之外,File’s Owner还有负责内存管理的功能。这个可以参考IBOutlet内存管理,在apple给的文档中也有说明或者google/百度一下也可以。
nib 加载过程分析以及对File’s Owner的理解的更多相关文章
- 转:A10/A20 Bootloader加载过程分析
来自:http://blog.csdn.net/allen6268198/article/details/12905425 A10/A20 Bootloader加载过程分析 注:由于全志A10和A20 ...
- 【转】全志A10/A20 Bootloader加载过程分析
原文 : http://blog.csdn.net/allen6268198/article/details/12905425 从这里开始:http://linux-sunxi.org/Bootabl ...
- ios中自定义tableView,CollectionView的cell什么时候用nib加载,什么时候用标识重用
做了一段时间的iOS,在菜鸟的路上还有很长的路要走,把遇到的问题记下来,好记性不如烂笔头. 在项目开发中大家经常会用到tableView和collectionView两个控件,然而在cell的自定义上 ...
- UIViewController XIB/NIB加载过程
UIViewController中关于nib初始化的函数 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBu ...
- seaJS 模块加载过程分析
先看一个seajs的官方example, 以下以seajs.use('main')为例, 解析加载mod main的过程 //app.html seajs.use("main") ...
- Nib加载的方式实现自定义TableView
实现的效果 实现原理: 通过在主界面中用Bundle 的LoadNib的方式进行自定义窗体文件加载并渲染界面 实现步骤 Step One 创建TableViewCell 窗体 Step Two 定义接 ...
- Insmod模块加载过程分析
一.背景 a) 在进行JZ2440的一个小demo开发的时候,使用自己编译的内核(3.4.2)及lcd模块进行加载时,insmod会提示加载失败因为内核版本不匹配(提示当前内核版本为空),并且显示模块 ...
- php编译完php.ini加载问题-Loaded Configuration File (none)
编译安装php7时指定了--with-config-file-path=/usr/local/php7/etc,修改了 php.ini 的配置后重启,但就是不生效. 出现Loaded Configur ...
- 动态加载 移除js file
动态加载.移除.替换js/css文件 stylesheetjavascriptcssfunctionnull <script language="javascript"> ...
随机推荐
- beego离线安装及运行
官网: https://beego.me/ 由于公司上不了网,啥都得下载到本地来弄. go的安装不多说了,GOPATH要设置好的. 先离线下载好https://github.com/astaxie/b ...
- 【PAT】1001. A+B Format (20)
1001. A+B Format (20) Calculate a + b and output the sum in standard format -- that is, the digits m ...
- 爱奇艺全国高校算法大赛初赛C
区间$dp$. 倒着考虑这件事件,肯定有最后一个取走的数字,假设是$a[k]$,那么最后一次取走的价值肯定是$a[0]*a[k]*a[n+1]$,之前取走的价值和为$[1,k-1]$的价值加上$[k+ ...
- 洛谷P2234 [HNOI2002] 营业额统计 [splay]
题目传送门 营业额统计 题目描述 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天 ...
- Python并发编程-多进程socketserver简易版
普通版的socketserver #server.py import socket sk = socket.socket() sk.bind(('127.0.0.1',8080))#建立连接 sk.l ...
- go chapter 10 函数 方法 struct的方法
1. struct的方法 // 定义struct type MyStruct struct{} // 定义方法 (那个对象可以回调)方法名(参数) 返回值 {} (s *MyStruct) FillS ...
- Unity 2D游戏开发教程之为游戏场景添加多个地面
Unity 2D游戏开发教程之为游戏场景添加多个地面 为游戏场景添加多个地面 显然,只有一个地面的游戏场景太小了,根本不够精灵四处活动的.那么,本节就来介绍一种简单的方法,可以为游戏场景添加多个地面. ...
- SpringBoot学习(二)
MyBatis是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.spring Boot 是能支持快速创建 Spring 应用的 ...
- nyoj 18 The Triangle
The Triangle 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure ...
- Python 2.7.x 和 3.x 版本的语法区别
<__future__模块> Python 3.x引入了一些与Python 2不兼容的关键字和特性,在Python 2中,可以通过内置的__future__模块导入这些新内容.如果你希望在 ...