OC中的initialize方法

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
阅读更多
个人分类: iOS开发
想对作者说点什么? 我来说一句

iOS OC-JS完美交互

2018年05月29日 3.84MB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭