initialize:
第一次初始化这个类之前被调用,可以用它来初始化一些静态变量。在创建子类的时候,子类会去调用父类的+ initialize方法,initialize方法的调用时机,当向该类发送第一个消息(一般是类消息首先调用,常见的是alloc)的时候,先调用类中的,再调用类别中的(类别中如果有重写);如果该类只是引用,没有调用,则不会执行initialize方法。如果子类如果有重写initialize,则在init之前会调用自己的initialize;如果没有的话就调用父类的initialize(这时候是子类son调用的)
load的调用
oad方法在这个文件被程序装载时调用。只要是在Compile Sources中出现的文件总是会被装载,这与这个类是否被用到无关,因此load方法总是在main函数之前调用。如果一个类实现了load方法,在调用这个方法前会首先调用父类的load方法。而且这个过程是自动完成的,并不需要我们手动实现
两者方法的共同点:自动调用父类的,不需要super操作;自动调用仅仅会调用一次(不包括外部显示调用)。
虽然initialize方法对一个类而言只会调用一次,但这里由于出现了两个类,所以调用两次符合规则,但不符合我们的需求。正确使用initialize方法的姿势如下:
// In Parent.m
+ (void)initialize {
if(self== [Parentclass]){
NSLog(@"Initialize Parent, caller Class %@", [selfclass]);
}
}
加上判断后,就不会因为子类而调用到自己的initialize方法了。
首先要明确如果子类实现了load方法,调用子类的load方法时会调用到父类的load方法(相当于有一个 [super load],虽然没有写出来)。但是如果子类没有重写load方法,显然默认的load还是要调用的,但这时候不会因为调用子类的load方法而导致父类的load方法被调用。当然,如果父类方法本来就该被调用(项目引用到这个文件),那还是要在文件被装载的时候调用的。