OC中的initialize方法

来源:互联网 发布:淘宝客推广链接格式 编辑:程序博客网 时间:2024/05/01 18:03

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 initializeFather initFather initFather 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 initFather initFather initFather initializeFather 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:FatherFather initFather initFather initFather initialize class:SonFather init
0 0
原创粉丝点击