init,initialize,initWithFrame,initWithCoder,awakeFromNib等区别
1.init 与initialize
对于iOS程序,创建几个类对象,就会调用几次init。下面分别重写 举例如下:
创建一个Person类,分别重写initialize和init方法
#import "Person.h"
@implementation Person
+(void)initialize {
NSLog(@"%s", __FUNCTION__);
}
-(instancetype)init {
NSLog(@"%s", __FUNCTION__);
return self;
} @end
然后创建Person类的两个对象实例
- (void)viewDidLoad {
[super viewDidLoad];
Person *p1 = [[Person alloc]init];
Person *p2 = [[Person alloc]init];
}
经过运行,我们可以看到如下结果

虽然我们创建两个实例,但是initialize仅仅被调动了一次,也可以看到,直至我们创建一个Person的实例时,initialize才被调用。
(2)拓展:
如果Person有一个子类的话,比如叫Teacher
#import "Person.h"
@interface Teacher : Person
@end #import "Teacher.h"
@implementation Teacher @end
注意:在Teacher的.m文件中,并没有实现initialize方法
我们同样创建Teacher类的一个实例对象
Teacher *t = [[Teacher alloc]init];
此时再次输出结果如下:

从这个结果可以看出有3个init与2个initialize,如果一个子类没有实现initialize,那么父类会调用这个方法两次,一次为自己,一次为子类。
2.init与initWithFrame
这是一个自定义的View
@implementation MyView
- (instancetype)init {
if (self = [super init]) {
NSLog(@"调用了init");
}
return self;
} - (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
NSLog(@"调用了initWithFrame");
}
return self;
} @end
如今我调用它的init方法
MyView *myView = [[MyView alloc] init];
结果如下:

代码的调用顺序如下:
(1)动态查找MyView的init方法
(2)调用super init方法
(3)super init方法内部执行的是[super initWithFrame:CGRectZero];
(4)然后super会发现MyView实现了initWithFrame方法
(5)转而执行 [MyView initWithFrame:CGRectZero]
(6)最后执行init其余部分
init 内部会调用父类的 initWithFrame: 方法,只不过传入的 frame 的值为0,然后父类的 initWithFrame: 方法发现当前的调用对象是子类对象,所以就调用了子类的initWithFrame方法了。这是一个多态的应用。
3.initWithFrame,initWithCoder与awakeFromNib区别
一般创建UI对象有两种方式。 一种是通过代码。
如果是通过代码创建,那么就会调用这个方法,进行frame的部署------initWithFrame调用,
UIView *v= [[UIView alloc]initWithFrame:CGRectMake(0,0,Screen_Width,Screen_Heigth)];
- (id)initWithFrame:(CGRect)frame
{
if (self =[superinitWithFrame:frame]) { }
return self;
}
一种是通过nib,通过拖拽控件模式,initWithCoder与awakeFromNib方法
首先initWithCoder 再然后- awakeFromNib唤醒这些实例对象。
init,initialize,initWithFrame,initWithCoder,awakeFromNib等区别的更多相关文章
- OC--init,initialize,initWithCoder:,initWithFrame:各方法的区别和加载顺序
1.先把OC的类分清楚各有什么方法 普通类的方法 init initialize: 控制器类的方法 init initialize: initWithCoder: UI控件类的方法 init init ...
- [BS-05] init、initWithFrame和initWithCoder的区别
init.initWithFrame和initWithCoder的区别 1.Xib方式自定义UIView(指任意的UI控件) 使用Xib文件,就是我们所常用的“拖控件”的方式.如果我们使用了该方法创建 ...
- iOS initWithFrame、initWithCoder、awakeFromNib的区别解析
当我们需要自定义一个View控件时,会有 initWithFrame.initWithCoder.awakeFromNib 这三个系统方法,关于这三个方法何时调用,如何调用,有时候可能很多人会弄混淆. ...
- UIView的layoutSubviews,initWithFrame,initWithCoder方法
****************************layoutSubviews************************************ layoutSubviews是UIView ...
- xcode initWithCoder\awakeFromNib\layoutSubviews
控件通过xib,storyboard创建,初始化设置一定会调用initWithCoder awakeFromNib 加载完毕的时候肯定会调用 layoutSubviews 布局子控件 位置和尺寸 利用 ...
- initWithFrame、initWithCoder、awakeFromNib的区别和调用次序 & UIViewController生命周期 查缺补漏
当我们创建或者自定义一个UI控件时,就很可能会调用awakeFromNib.initWithCoder .initWithFrame这些方法.三者的具体区别如下: initWithFrame: 通过代 ...
- init/loadView/viewDidLoad/initWithNibName/awakeFromNib/initWithCoder的用法
init/loadView/viewDidLoad/viewDidUnload 这么细节的东西想来大家都不在意,平时也不会去关系,但是在面试时却常常被提到,所以了解viewController的生命周 ...
- 【学习总结】 init & initWithFrame & initWithCoder
//当我们所写的程序里没用用Nib文件(XIB)时,用代码控制视图内容,需要调用initWithFrame去初始化 - (id)initWithFrame:(CGRect)frame { if (se ...
- init&initWithFrame&initWithCoder
//当我们所写的程序里没用用Nib文件(XIB)时,用代码控制视图内容,需要调用initWithFrame去初始化 - (id)initWithFrame:(CGRect)frame { if (se ...
随机推荐
- linux下mongodb安装、服务器、客户端、备份、账户命令
在linux环境安装mongoDB: 一般认为偶数版本为稳定版 如 1.6.x,奇数版本为开发版如1.7.x 32bit的mongoDB最大能存放2g的数据,64bit没有限制 方法1: 终端执行: ...
- c++中的类之构造函数
一.构造函数的缘由 本文我们主要来讲解c++中类的构造函数,其中涉及了深拷贝和浅拷贝的问题,这也是在面试笔试中经常会碰到的问题.如果您是第一次听说构造函数,可能会觉得这个名字有点高大上,而它却和实际中 ...
- Linux下wget获取ftp下目录下文件
如果某个目录下有一个文件可以使用ftp命令: get xxx 如果是某个目录下有多个文件(且不需要获取目录下子文件夹下的内容): mget * 如果是某个目录下有子目录希望获取所有子目录: wget ...
- geotrellis使用(三十七)COG 基础介绍
前言 Geotrellis 已经迭代到了 2.0 版本(截止写作此文时为 2.0.0-SNAPSHOT 版),2.0 版多了很多新的特性,其中最重要的应该就是 COG,COG 是什么鬼?刚看到时我也是 ...
- requests+正则表达式提取猫眼电影top100
#requests+正则表达式提取猫眼电影top100 import requests import re import json from requests.exceptions import Re ...
- Lua版组合算法
高效率的排列组合算法--<编程珠矶>--Lua实现 原文链接 原文是python实现的,这里给出lua版本的实现 组合算法 本程序的思路是开一个数组,其下标表示1到m个数,数组元素 ...
- YARN中FIFO、Capacity以及Fari调度器的详细介绍
(1)FIFO Scheduler 将所有的Applications放到队列中,先按照作业的优先级高低.再按照到达时间的先后,为每个app分配资源.如果第一个app需要的资源被满足了,如果还剩下了资源 ...
- 功能整合(一):滚动条的变相隐藏、js控制div的渐变显示、滚动条监听
1.滚动条的变相隐藏 思路: 1. 把body的横向,纵向的超出部分隐藏,宽设置100%:高设置100%.就没有body的滚动条了, 2. 然后把最外层的div的宽设置的比body的宽宽一点,把d ...
- [LeetCode] Network Delay Time 网络延迟时间
There are N network nodes, labelled 1 to N. Given times, a list of travel times as directed edges ti ...
- 再谈前端HTML模板技术
在web2.0之前,写jsp的时候虽然有es和JSTL,但是还是坚持jsp.后面在外包公司为了快速交货,还是用了php Smart技术. web2.0后,前端模板技术风行. 代表有如下三大类: Str ...