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--init,initialize,initWithCoder:,initWithFrame:各方法的区别和加载顺序

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

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

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

OC中类的load和initialize方法

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

OC中initialize方法和init方法的区别

initialize不是init Objective-C中是带有运行时间的。 运行时间好处是,它可以在你的程序运行的流程中进行参与。在Objective-C中,它包括检查是否一个对象可...

OC- +load方法 和 +initialize方法

1、+load 方法+load 方法是当类或分类被添加到 Objective-C runtime 时被调用的,实现这个方法可以让我们在类加载的时候执行一些类相关的行为。子类的 +load 方法会在它的...

C18_OC08-load、initialize、description

/** 前文中的“类”,就是“类对象” 类对象的类型叫Class-类(看到这个单词,似乎有种Java的亲切感) 前文中的“对象”,就是“实例对象” 实例对象的类型叫类 程序启动时...
  • Vigiles
  • Vigiles
  • 2014年05月05日 23:08
  • 1096

Objective-C的Initialize初始化方法研究

这篇文章介绍了Objective-C比较底层的内容,主要讲解initialize和init方法的区别。从这篇文章中我们不光可以了解Objective-C在初始化时所做的事情,更可以学习到一些如何研究O...

NSObject的load和initialize方法

NSObject中的load和initialize NSObject中的这两个类方法比较特殊,主要用于完成类的加载和初始化。 网上有一些很多资料与讲解,苹果的官方文档中也有相关的介绍。这里只是我自...

NSObject 的 load 和 initialize 方法

也许有很多人都和我一样,在此之前都没有听过 load 方法。事实上,它可是 NSObject 中的第一个方法哦: load 方法平时的确不常用,但是在用到 runtime 中的 swizzli...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OC中的initialize方法
举报原因:
原因补充:

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