看到一篇讲init和initialize初始化的文章,只是对流程的讲解,其实很简单,大家看一下就明白了。
原文地址:
http://kupuk.com/2008/03/23/objective-c-initialize-method/
作者:Paul Robinson
有了这个在每个Objective-C程序中都会起作用的附加运行时间,给了它一些动态的特性。C和C++没有运行时间,他们仅仅被编译为完全按照代码的顺序去执行,不多也不少。
运行时间的行为之一就是initialize。虽然看起来有点像大家常见的init,但是他们并不相同。
举个例子,比如一个叫做Duck的类:
-
#import "Duck.h";
-
-
@implementation Duck
-
-
+ ( void ) initialize {
-
NSLog (@ "Duck initialize" );
-
}
-
-
- ( void ) init {
-
NSLog (@ "Duck init" );
-
}
-
@end
我们在这里记录initialize和init调用的时间。
[Session started at 2008-03-23 20:03:25 -0400.]
2008-03-23 20:03:25.869 initialize_example[30253:10b] Hello, World!
2008-03-23 20:03:25.871 initialize_example[30253:10b] Duck initialize
2008-03-23 20:03:25.872 initialize_example[30253:10b] Duck init
2008-03-23 20:03:25.873 initialize_example[30253:10b] Duck init
2008-03-23 20:03:25.873 initialize_example[30253:10b] Duck init
但是如果Duck有一个子类的话,比如我们建一个Duck的子类叫做Chicken(好怪异……):
-
NSLog (@ "Hello, World!" );
-
-
Duck * duck1 = [[Duck alloc ] init ];
-
Duck * duck2 = [[Duck alloc ] init ];
-
Duck * duck3 = [[Duck alloc ] init ];
-
-
Chicken * chicken = [[Chicken alloc ] init ];
-
}
[Session started at 2008-03-23 20:13:34 -0400.]
2008-03-23 20:13:34.696 initialize_example[30408:10b] Hello, World!
2008-03-23 20:13:34.698 initialize_example[30408:10b] Duck initialize
2008-03-23 20:13:34.699 initialize_example[30408:10b] Duck init
2008-03-23 20:13:34.700 initialize_example[30408:10b] Duck init
2008-03-23 20:13:34.700 initialize_example[30408:10b] Duck init
2008-03-23 20:13:34.700 initialize_example[30408:10b] Duck initialize
2008-03-23 20:13:34.701 initialize_example[30408:10b] Duck init
看来如果一个子类没有实现initialize方法,那么超类会调用这个方法两次,一次为自己,而一次为子类。
[Session started at 2008-03-23 20:21:08 -0400.]
2008-03-23 20:21:08.816 initialize_example[30513:10b] Hello, World!
2008-03-23 20:21:08.818 initialize_example[30513:10b] Duck initialize class:Duck
2008-03-23 20:21:08.819 initialize_example[30513:10b] Duck init
2008-03-23 20:21:08.820 initialize_example[30513:10b] Duck init
2008-03-23 20:21:08.820 initialize_example[30513:10b] Duck init
2008-03-23 20:21:08.820 initialize_example[30513:10b] Duck initialize class:Chicken
2008-03-23 20:21:08.821 initialize_example[30513:10b] Duck init
<span 0px\"="">如果你希望确定只用了initialize一次用来实现某些单独运行的工作,或者希望实现仅仅运行一次的方法,检查一下[self class],才能确定是否是你希望做到的效果。