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