很多朋友如果是初学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];

在这个加载过程中,相关方法的调用:

1 -(instancetype)init;
2
3 -(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;//加载带有xib的控制器(默认ViewController)45 -(void)loadView; //加载控制器视图67 - (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中都调用一下,这样就保证了无论你是通过什么方式创建的控件,代码都能起到作用。

转载于:https://www.cnblogs.com/henusyj-1314/p/9928514.html

iOS 初始化(init、initWithNibName、initWithCoder、initWithFrame)相关推荐

  1. 浅析 Linux 初始化 init 系统: UpStart

    浅析 Linux 初始化 init 系统: UpStart Upstart 简介 假如您使用的 Linux 发行版是 Ubuntu,很可能会发现在您的计算机上找不到/etc/inittab 文件了,这 ...

  2. python中如何只执行一次初始化init工作

    只执行一次初始化init工作: 这篇文章:python中的单例:让类创建的对象,在系统中只有唯一的一个实例 讲到了对__new__进行改造后,每次都会得到第一次被创建对象的引用 但是:初始化方法还是会 ...

  3. 华为游戏初始化init失败,返回错误码907135000

    问题描述 用android studio 集成华为游戏服务SDK后,测试游戏时初始化init失败,报错statusCode 907135000,我在官方开发指导文档网站上搜索该错误码: 该错误码表示传 ...

  4. initWithNib init initWithCoder initWithFrame

    1. TestViewController * tempVC = [[TestViewController alloc]initWithNibName:@"TestViewControlle ...

  5. IOS初始化控制器的两种方法

    题记 生活很简单,只不过就是忘记了知识,再去学习知识. 笔录一 ViewControllViewController方式 #import "AppDelegate.h" #impo ...

  6. 浅析 Linux 初始化 init 系统

    第 1 部分: sysvinit 从 sysvinit 到 systemd 近年来,Linux 系统的 init 进程经历了两次重大的演进,传统的 sysvinit 已经淡出历史舞台,新的 init ...

  7. 浅析 Linux 初始化 init 系统:sysvinit

    2019独角兽企业重金招聘Python工程师标准>>> 从 sysvinit 到 systemd 近年来,Linux 系统的 init 进程经历了两次重大的演进,传统的 sysvin ...

  8. 第二部分:浅析 Linux 初始化 init 系统:upstart

    Upstart 简介 假如您使用的 Linux 发行版是 Ubuntu,很可能会发现在您的计算机上找不到/etc/inittab 文件了,这是因为 Ubuntu 使用了一种被称为 upstart 的新 ...

  9. 浅析 Linux 初始化 init 系统,第 3 部分: Systemd

    近年来,Linux 系统的 init 进程经历了两次重大的演进,传统的 sysvinit 已经逐渐淡出历史舞台,新的 UpStart 和 systemd 各有特点,越来越多的 Linux 发行版采纳了 ...

  10. 浅析 Linux 初始化 init 系统,第 2 部分: UpStart

    近年来,Linux 系统的 init 进程经历了两次重大的演进,传统的 sysvinit 已经淡出历史舞台,新系统 UpStart 和 systemd 各有特点,而越来越多的 Linux 发行版采纳了 ...

最新文章

  1. 社区运营破冰也有三大原则八项注意“了,你造吗?
  2. jQuery使用ajax跨域请求获取数据
  3. matlab 转换图片格式,Matlab实现图片格式转换 pgm转jpg等
  4. WordPress微信小程序社区论坛源码
  5. bzoj 1565 [NOI2009]植物大战僵尸【tarjan+最大权闭合子图】
  6. linux驱动位置_Linux驱动程序学习一 (续)
  7. sqlserver 累计数量_用sqlserver查询累计值
  8. angularJS使用编写KindEditor,UEidtor,jQuery指令,双重绑定
  9. bboss v5.5.3 发布,Elasticsearch Rest Client
  10. 8.声卡驱动05-自己实现alsa驱动-虚拟声卡-kcontrol
  11. OLED驱动芯片SSD1306解读
  12. 10、【易混淆概念集】-第六章1 三点估算 类比估算和参数估算的区别 储备分析 历时估算 项目进度网络图
  13. 以下对python程序缩进格式描述错误的是_转载 | python二级选择题与分析(8)
  14. centos7 查看本地ip地址
  15. 看雪CTF.TSRC 2018 团队赛 第一题 初世纪 writeup
  16. 又是一个想当然的错误
  17. ValueError: With n_samples=0, test_size=0.15 and train_size=None, the resulting train set will be em
  18. 黎曼zeta函数不需解析延拓
  19. Cortex-M3/M4(2)-架构
  20. 区块链中什么是DAO、DAC、KYC ?

热门文章

  1. 五步法建设你的数据中台
  2. 巧用“搜索”解决自学编程遇到的难题
  3. .Net软件设计新思维
  4. 博客也是网络赚钱的有利工具
  5. 02矩阵01 ——概念、运算和基本矩阵、对角矩阵、方幂、数量矩阵、转置矩阵、对称矩阵、逆矩阵、奇异矩阵、三角矩阵、矩阵乘积的行列式与秩
  6. 8.1 模型压缩的方法
  7. 再谈哈希:Hash中的冲突消解机制以及拉链法
  8. Django项目实践2 - Django模板(view-html)
  9. Word2Vec 与 Word Embedding的关系
  10. coco数据集大小分类_COCO数据集的简单介绍