区别:
+ (void) load | + (void) initialize | - (id) init | |
执行时机 | 在程序运行后立即执行 | 在类的第一个方法第一次被调用 (即类接收到消息) 之前执行,同一个类只会执行一次,与对象个数的多少无关 | 在对象实例化时调用,如 [[NSObject alloc] init],每实例化一个对象就会调用一次, |
若自身未定义,是否沿用父类方法 | 否 | 是 | 是 |
类别中的定义 | 全都执行,但主类优先于分类加载 | “覆盖”类中的方法,只执行一次 | “覆盖”类中的方法 |
load的常见用途:
- 在主函数运行之前,load 方法就会调用。
- 由于它的调用不是惰性的,且其只会在程序调用期间调用一次 (所以runtime中交换方法的实现经常写在load方法中,可以确保方法仅交换一次),最最重要的是,如果在类与分类中都实现了 load 方法,它们都会被调用,不像其它的在分类中实现的方法会被覆盖,这就使 load 方法成为了方法调剂的绝佳时机。
init 与 initialize 的demo:
#import "LZPerson.h"
@implementation LZPerson
- (id)init {
if (self = [super init]) {
count++;
}
return self;
}
+ (void)initialize {
static int count = 0;
}
+ (int)getCount {
return count;
}
@end
--------------------------------------
int main( int argc, const char *argv[] ) {
LZPerson *p1 = [[LZPerson alloc] init]; //在调用init之前会先调用initialize方法
LZPerson *p2 = [[LZPerson alloc] init]; //调用init不会再调用initialize,只会调一次
// print count
NSLog(@"LZPerson count: %i", [LZPerson getCount] );//2
LZPerson *p3 = [[LZPerson alloc] init];
NSLog(@"LZPerson count: %i", [LZPerson getCount] );//3
return 0;
}