OC中的initialize方法

原创 2016年05月31日 16:11:08

initialize不是init,运行时间的行为之一就是initialize。虽然看起来有点像大家常见的init,但是他们并不相同。在程序运行过程中,它会在你程序中每个类调用一次initialize。这个调用的时间发生在你的类接收到消息之前,但是在它的父类接收到initialize之后。
举个例子,比如一个叫做Father的类:

@implementation Father
+(void) initialize {
    NSLog(@"Father initialize");
}

-(void) init {
    NSLog(@"Father init");
}
@end

我们在这里记录initialize和init调用的时间。
我们建立三个Father对象的实例:

NSLog(@"Hello, World!");
Father *father1 = [[Father alloc] init];
Father *father2 = [[Father alloc] init];
Father *father3 = [[Father alloc] init];

看一下记录:

Hello, World!
Father initialize
Father init
Father init
Father init

我们可以看到,虽然我们创建了3个Father的实例,但是initialize仅仅被调用了一次。我们也可以看到,直到我们创建第一个Father的实例之前,initialize才被调用。
但是如果Father有一个子类的话,比如我们建一个Father的子类叫做Son。

@interface Son : Father {

}
@end

注意Son这个类并没有实现initialize方法。如果我们同样运行这个程序,但是加上一个Son的实例:

NSLog(@"Hello, World!");
Father *father1 = [[Father alloc] init];
Father *father2 = [[Father alloc] init];
Father *father3 = [[Father alloc] init];
Son *son = [[Son alloc] init];
@end

我们再来看一下记录

Hello, World!
Father initialize 
Father init
Father init
Father init
Father initialize
Father init
@end

我们看到了4个Father的init和2个Father的initialize方法。这是怎么回事呢?
看来如果一个子类没有实现initialize方法,那么他会调用父类的initialize方法,我们在Father的initialize类中记录一下类名,这样可以看得更清楚:

+(void) initialize {
   NSLog(@"Father initialize class:%@",[self class]);
}

现在看就清楚多了:

Hello, World!
Father initialize class:Father
Father init
Father init
Father init
Father initialize class:Son
Father init

OC中load方法和initialize方法的异同

介绍OC中 +load 方法和 +initialize 方法的异同
  • Cloudox_
  • Cloudox_
  • 2017年02月20日 09:40
  • 1572

OC中类的load和initialize方法

看到寒哥教你学iOS - 经验漫谈中有使用load方法来加载第三方类库的情况。在《Effective Objective-C 2.0》中有一节也是讲load与initialize方法的。发现自己并没有...
  • u014084081
  • u014084081
  • 2015年09月07日 17:00
  • 1636

iOS Objective-C 中的 initialize 和 init 的介绍

Objective-C 中的 initialize 和 init 的介绍
  • yuner1029
  • yuner1029
  • 2016年03月21日 15:32
  • 1244

[iOS]细说OC中的load和initialize方法

之前在替换数组内部方法的时候: [iOS]防止数组越界及添加空值的crash的扩展,使用到了load方法,今天看到了一个详细的介绍的文章,就转载而来以供学习!! OC中有两个特殊的类方法,分别是lo...
  • lqq200912408
  • lqq200912408
  • 2016年03月02日 13:52
  • 723

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

1、先把OC的类分清楚各友善么方法 普通类的方法 init initialize: 控制器类的方法 init initialize: initWithCoder: UI控件类的方法 ini...
  • u012592258
  • u012592258
  • 2015年10月14日 12:15
  • 2349

OC中的load和initialize方法

OC中有两个特殊的类方法,分别是load和initialize。本文总结一下这两个方法的区别于联系、使用场景和注意事项。Demo可以在我的Github上找到——load和initialize,如果觉得...
  • lijiexiaoge
  • lijiexiaoge
  • 2016年03月22日 22:37
  • 138

swift中使用OC的方法;在OC中调用swift方法

swift中使用OC的方法;在OC中调用swift方法
  • wj748499404
  • wj748499404
  • 2016年07月21日 02:13
  • 2551

initialize方法和init区别详解

1、定义Father类 // // Father.m // // Created by 李建 on 15/8/22. // Copyright (c) 2015年 李建. All right...
  • sbvfhp
  • sbvfhp
  • 2015年08月22日 11:31
  • 10904

懒惰的 initialize 方法

因为 ObjC 的 runtime 只能在 Mac OS 下才能编译,所以文章中的代码都是在 Mac OS,也就是 x86_64 架构下运行的,对于在 arm64 中运行的代码会特别说明。 ...
  • sun2728
  • sun2728
  • 2016年05月08日 11:12
  • 813

thinkphp5中的_initialize方法

public function _initialize(){ echo  '优先执行的操作'.''; } 初始化方法的注意事项 : a)使用初始化方法必须继承Controller控制器...
  • wang_magento
  • wang_magento
  • 2017年12月12日 16:40
  • 152
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OC中的initialize方法
举报原因:
原因补充:

(最多只允许输入30个字)