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...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

OC中类的load和initialize方法

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

OC- +load方法 和 +initialize方法

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

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

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

C18_OC08-load、initialize、description

/** 前文中的“类”,就是“类对象” 类对象的类型叫Class-类(看到这个单词,似乎有种Java的亲切感) 前文中的“对象”,就是“实例对象” 实例对象的类型叫类 程序启动时...

Objective C类方法load和initialize的区别

过去两个星期里,为了完成一个工作,接触到了NSObject中非常特别的两个类方法(Class Method)。它们的特别之处,在于iOS会在运行期提前并且自动调用这两个方法,而且很多对于类方法的规则(...

Objective C类方法load和initialize的区别

Objective C类方法load和initialize的区别 过去两个星期里,为了完成一个工作,接触到了NSObjec...

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

这篇文章介绍了Objective-C比较底层的内容,主要讲解initialize和init方法的区别。从这篇文章中我们不光可以了解Objective-C在初始化时所做的事情,更可以学习到一些如何研究O...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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