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等区别的更多相关文章

  1. OC--init,initialize,initWithCoder:,initWithFrame:各方法的区别和加载顺序

    1.先把OC的类分清楚各有什么方法 普通类的方法 init initialize: 控制器类的方法 init initialize: initWithCoder: UI控件类的方法 init init ...

  2. [BS-05] init、initWithFrame和initWithCoder的区别

    init.initWithFrame和initWithCoder的区别 1.Xib方式自定义UIView(指任意的UI控件) 使用Xib文件,就是我们所常用的“拖控件”的方式.如果我们使用了该方法创建 ...

  3. iOS initWithFrame、initWithCoder、awakeFromNib的区别解析

    当我们需要自定义一个View控件时,会有 initWithFrame.initWithCoder.awakeFromNib 这三个系统方法,关于这三个方法何时调用,如何调用,有时候可能很多人会弄混淆. ...

  4. UIView的layoutSubviews,initWithFrame,initWithCoder方法

    ****************************layoutSubviews************************************ layoutSubviews是UIView ...

  5. xcode initWithCoder\awakeFromNib\layoutSubviews

    控件通过xib,storyboard创建,初始化设置一定会调用initWithCoder awakeFromNib 加载完毕的时候肯定会调用 layoutSubviews 布局子控件 位置和尺寸 利用 ...

  6. initWithFrame、initWithCoder、awakeFromNib的区别和调用次序 & UIViewController生命周期 查缺补漏

    当我们创建或者自定义一个UI控件时,就很可能会调用awakeFromNib.initWithCoder .initWithFrame这些方法.三者的具体区别如下: initWithFrame: 通过代 ...

  7. init/loadView/viewDidLoad/initWithNibName/awakeFromNib/initWithCoder的用法

    init/loadView/viewDidLoad/viewDidUnload 这么细节的东西想来大家都不在意,平时也不会去关系,但是在面试时却常常被提到,所以了解viewController的生命周 ...

  8. 【学习总结】 init & initWithFrame & initWithCoder

    //当我们所写的程序里没用用Nib文件(XIB)时,用代码控制视图内容,需要调用initWithFrame去初始化 - (id)initWithFrame:(CGRect)frame { if (se ...

  9. init&initWithFrame&initWithCoder

    //当我们所写的程序里没用用Nib文件(XIB)时,用代码控制视图内容,需要调用initWithFrame去初始化 - (id)initWithFrame:(CGRect)frame { if (se ...

随机推荐

  1. android studio 何如修改报名

    1. 重命名办法,网上很多见 2. 对于需要重新修改包名的级别的 a. 修改package 和 gradle 的包名,对应一致. b. 修改R 所在包名,使用crtl+n修改R文件的路径 c. 手动首 ...

  2. linux 安装jdk以及nginx详细过程

    一.安装jdk 1:首先下载jdk到本地,然后通过git 上传到linux服务器上 2:进入目录usr,并创建目录java,将jdk的压缩文件移动到该目录下 cd /usr mkdir java mv ...

  3. JavaScript 重点笔记

    JavaScript 重点笔记 ## 数组 // 必须掌握 - arr.length:获取数组元素的长度 - arr.splice(起始位置,长度):从数组中添加或删除元素. - arr.indexO ...

  4. 浅析Java的Frok/Join框架

    一丶Fork/Join框架产生背景: 随着并发需求的不断提高和硬件的不断发展,程序并行执行仿佛就提上日程上来了,伟大的毛主席就说过:"人多力量大",所以如果一件事可以分配给多个人同 ...

  5. spring clound微服务架构实践(1)——搭建服务注册中心

    一.创建一个空maven parent模板 1-1.新建project,选择maven 1-2.给此模板起名 1-3.此模板的保存位置,此处放入我的git项目spring-clound-learnin ...

  6. 洛谷 P2590 [ZJOI2008]树的统计(树链剖分)

    题目描述一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v ...

  7. JavaScript数据结构与算法(七) 双向链表的实现

    TypeScript方式实现源码 // 双向链表和普通链表的区别在于, 在链表中, // 一个节点只有链向下一个节点的链接,而在双向链表中,链接是双向的:一个链向下一个元素, // 另一个链向前一个元 ...

  8. CentOS下安装yum

    在Linux里面依次输入下面的命令: 1,下载最新的yum-3.2.28.tar.gz并解压 wget http://yum.baseurl.org/download/3.2/yum-3.2.28.t ...

  9. [LeetCode] Implement Magic Dictionary 实现神奇字典

    Implement a magic directory with buildDict, and search methods. For the method buildDict, you'll be ...

  10. 使用IntelliJ IDEA的小技巧快乐编程(1)

    前言 我很喜欢和别人讨论一些问题,有时候,在公司里,讨论这样的问题需要演示代码.常常会碰到的一种情况是(根据我的记忆这半年多来至少超过了10次),别人会打断你的演示,抛出一个问题:等等,你刚才的操作是 ...