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 ...
随机推荐
- React-Native(一):React Native环境搭建
第一步:安装jdk 从java官网下载jdk8 配置环境变量: JAVA_HOME:D:\Program Files\Java\jdk1.8.0_111 Path中追加:%JAVA_HOME%\bin ...
- Struts(二十一):类型转换与复杂属性、集合属性配合使用
背景: 本章节主要以复杂属性.集合属性类型转化为例,来学习这两种情况下怎么使用. 复杂对象属性转换场景: 1.新建struts_04 web.xml <?xml version="1. ...
- wpf的tab移动焦点只能在容器内部使用
设置 KeyboardNavigation.TabNavigation="Cycle" 即可
- c#获取网络时间并同步本地时间
通过TCP形式来获取NTP时间.主要代码如下: [DllImport("kernel32.dll")] private static extern bool SetLocalTim ...
- MySQL之SQL语句的优化
仅供自己学习 结论写在前面: 1.尽量避免进行全表扫描,可以给where和order by涉及的列上建立索引 2.尽量在where子句中使用 !=或<>操作符,因为这样会导致引擎放弃索引而 ...
- 在一个没有设置宽高的容器中,为什么设置position:absolute后就可以全屏显示了?
此场景适用于移动端百分比布局,背景全屏显示. 在一个没有设置宽高的容器中设置背景,想要背景全屏显示,设置bcakground-size:100%;后还需设置position:absolut; 原因: ...
- 如何让服务端同时支持WebSocket和SSL加密的WebSocket(即同时支持ws和wss)?
自从HTML5出来以后,使用WebSocket通信就变得火热起来,基于WebSocket开发的手机APP和手机游戏也越来越多.我的一些开发APP的朋友,开始使用WebSocket通信,后来觉得通信不够 ...
- [LeetCode] Diameter of Binary Tree 二叉树的直径
Given a binary tree, you need to compute the length of the diameter of the tree. The diameter of a b ...
- 织云Lite发布:详解包管理核心能力
本文由 织云平台团队 发布于 腾讯云云+社区 织云Lite发布 腾讯织云自动化运维体系经过10年技术积淀,维护近万个业务模块,超过20万节点.鉴于业界朋友的呼声,我们将织云的核心功能独立抽象出来,凝结 ...
- Spring Boot简单应用——会员管理系统
简介 本项目是使用Spring Boot编写的一个简单的会员管理系统. 提供了会员的解决方案,主要有会员模块,管理员模块,礼品模块,商品模块,会员等级模块,生日提醒模块,积分模块,详细模块如下图 准备 ...