iOS 初始化(init、initWithNibName、initWithCoder、initWithFrame)
很多朋友如果是初学iOS开发,可能会被其中的几个加载方法给搞得晕头转向的,但是这几个方法又是作为iOS程序员必须要我们掌握的方法,下面我将对这几个方法做一下分析和对比,看看能不能增加大家对几个方法的理解和使用.
一、初始化-加载了什么
//加载带有xib的控制器
-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;
//(控制器的View为空的时候调用,帮控制器加载View)
-(void)loadView;
//代码使用创建控件alloc init 时,系统底层调用init方法
-(instancetype)init;
//是当从nib文件中加载对象的时候会调用
-(instancetype)initWithCoder:(NSCoder *)aDecoder;
//(当.nib文件被加载的时候,会发送一个awakeFromNib的消息到.nib文件中的每个对象)
-(void)awakeFromNib;
//(代码创建View时调用,是懒加载,只有到需要显示时,子控件才不是 nil)
- (instancetype)initWithFrame:(CGRect)frame;
二、加载方式以及调用顺序
1.带有xib的storyboard的ViewController,重点是是一个控制器,不是一个View。
我们创建初始化一个控制器: ViewController *vc =[ [ViewController alloc]init];

在这个加载过程中,相关方法的调用:
-(instancetype)init; -(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;//加载带有xib的控制器(默认ViewController)
4
-(void)loadView; //加载控制器视图
6
- (void)viewDidLoad;
2.加载.xib的ViewController,此出和第一种方式有出入,可以看图片,所示

这个过程加载的相关方法
XiBViewController *vc =[[XiBViewController alloc]initWithNibName:@"XiBViewController" bundle:nil];
//调用顺序
initWithNibName:bundle:
loadView
viewDidLoad
注意:这里关于xib的加载,我们要知道,我在这里是将xib文件命名为jtest,但是一般来说,创建自定义控制器的时候xib的命名是和自定义控制器是同名的,如果xib和自定义控制器同名,那么此时我们就可以直接init创建不需要指定xib的名字:
XiBViewController *vc = [[XiBViewControlleralloc] init];
可以这样做的原因是,系统在底层首先调用init方法,在init方法内部自动会调用(initWithNibName)方法,首先系统先看看是否有指定名字的xib,如果没有就加载控制器同名但是去掉Controller的xib,还没有就加载与控制器同名的xib
3.init和initWithFrame方法
首先当代码创建控件时,会有init,此时会底层调用init方法,但是init又会在内部调用initWithFrame方法,总的来说,两个方法中作用都是对控件进行创建,在实际开发中可以将控件的创建直接写在initWithFrame方法即可
4. initWithFrame和initWithCoder方法
我们在创建UIVIew的时候,一般会使用两种方式:一种是代码,一种是拖控件(interface builder也就是使用nib文件的方式),我们时候拖控件的方式此时initWithFrame方法不会被调用,因为nib文件知道如何初始化该view(拖控件的时候已经定义好了长度高等属性),使用拖控件的方式会调用initWithCoder方法,在该方法中可以重新定义我们在nib中已经设置的各项属性
在使用代码进行view的创建的时候需要注意:当我们创建UIView的子类的时候,我们使用initWithFrame方法实例化UIVIew,并且特别注意:如果在子类中重载initWithFrame方法,必须先调用父类的initWithFrame方法,否则会出现一些意想不到的问题,看看使用initWithFrame创建的一般代码格式:
JNView.m:
#import "JNView.h"
@implementation JNView
- (instancetype)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
//在该方法中进行初始化设置
return self;
}
@end
最后总结:
1、initWithFrame只适用纯代码创建时调用,不涉及xib或storyboard。
2、initWithCoder、awakeFromNib是从xib、storyboard中创建时会调用。
3、所以一般来说,为了安全起见,初始化控件的代码我们写在一个方法里面(类似我上面的initViews方法),然后我们分别在initWithFrame和initWithCoder中都调用一下,这样就保证了无论你是通过什么方式创建的控件,代码都能起到作用。
iOS 初始化(init、initWithNibName、initWithCoder、initWithFrame)的更多相关文章
- OC--init,initialize,initWithCoder:,initWithFrame:各方法的区别和加载顺序
1.先把OC的类分清楚各有什么方法 普通类的方法 init initialize: 控制器类的方法 init initialize: initWithCoder: UI控件类的方法 init init ...
- 浅析 Linux 初始化 init 系统
近年来,Linux 系统的 init 进程经历了两次重大的演进,传统的 sysvinit 已经逐渐淡出历史舞台,新的 UpStart 和 systemd 各有特点,越来越多的 Linux 发行版采纳了 ...
- 【转】Linux 初始化 init 系统 [sysvinit systemd upstart]
http://www.ibm.com/developerworks/cn/views/linux/libraryview.jsp?sort_by=&show_abstract=true& ...
- 浅析 Linux 初始化 init 系统,第 1 部分: sysvinit 第 2 部分: UpStart 第 3 部分: Systemd
浅析 Linux 初始化 init 系统,第 1 部分: sysvinit 第 2 部分: UpStart 第 3 部分: Systemd http://www.ibm.com/developerw ...
- 温故之--Linux 初始化 init 系统
参选URL: http://www.ibm.com/developerworks/cn/linux/1407_liuming_init1/index.html 本系列一共三篇,看完记住,那水平就不一样 ...
- 【iOS开发】initWithNibName、initWithCoder、awakeFromNib和 loadNibNamed详解
第一.initWithNibName这个方法是在controller的类在IB中创建,但是通过Xcode实例化controller的时候用的. 第二.initWithCoder 是一个类在IB中创建但 ...
- initWithNibName&initWithCoder &awakeFromNib&UIView常见属性方法
第一.initWithNibName这个方法是在controller的类在IB中创建,但是通过Xcode实例化controller的时候用的. 第 二.initWithCoder 是一个类在IB中创建 ...
- IOS中 init和initialize
一.init和initialize 1.方法类型 1> init属于对象方法,-开头 2> initialize属于类方法,+开头 2.调用时刻 1> init:每个对象初始化的时候 ...
- 【iOS】init,loadView,viewDidLoad加载关系
一.loadView 永远不要主动调用这个函数.view controller会在view的property被请求并且当前view值为nil时调用这个函数.如果你手动创建view,你应该重载这个函数. ...
随机推荐
- 爬虫 xpath etree自动补全页面
aa = etree.HTML(response.content) bb = etree.tostring(aa) doc = etree.HTML(bb)
- Centos7之WEB服务器
1.安装httpd服务 输入命令:yum -y install httpd [root@N37012 ~]# yum -y install httpc Loaded plugins: fastestm ...
- jenkins+svn+pipeline+kubernetes部署java应用(三)
将jar包.Dockerfile.kubernetes部署yaml文件上传至svn自定义目录 一.生成流水线脚本 二.配置jenkins pipeline构建语句 三.点击构建java工程
- 使用U盘给笔记本重做系统
**一.戴尔 Vostro 14 3000 Series **1. 开机时快速按F12进入BIOS界面 **2. 按照下图进行一系列的处理,把U盘被设置为第一启动项 **3. 插入U盘后进入老毛桃PE ...
- 三分钟明白 Activity工作流 -- java运用
一. 什么是工作流 以请假为例,现在大多数公司的请假流程是这样的 员工打电话(或网聊)向上级提出请假申请——上级口头同意——上级将请假记录下来——月底将请假记录上交公司——公司将请假录入电脑 采用工作 ...
- 虚拟机中配置SQL SERVER2008R2远程访问
VM虚拟机中配置数据库访问 选择虚拟机设置--硬件--网络适配器,选择桥接模式:直接连接物理网络 不可选用主机模式(与主机共享专用网络) 数据库远程配置,转自:http://jingyan.baidu ...
- Assignment HDU - 2853(二分图匹配 KM 新边旧边)
传送门: Assignment HDU - 2853 题意:题意直接那松神的题意了.给了你n个公司和m个任务,然后给你了每个公司处理每个任务的效率.然后他已经给你了每个公司的分配方案,让你求出最多能增 ...
- Codeforces Round #464 (Div. 2) B. Hamster Farm
B. Hamster Farm time limit per test2 seconds memory limit per test256 megabytes Problem Description ...
- BFS:Nightmare(可返回路径)
解题心得: 1.point:关于可以返回路径的BFS的标记方法,并非是简单的0-1,而是可以用时间比较之后判断是否push. 2.queue创建的地点(初始化问题),在全局中创建queue在一次调用B ...
- java中如何判断一个字符串是否包含另外一个字符串的方法
indexOf(String s)的使用,如果包含,返回的值是包含该子字符串在父类字符串中起始位置: 如果不包含必定全部返回值为-1 package my_automation; public cla ...