补充一个加载过程的知识点, 那就是类别的加载过程, 类别的加载过程有一些特殊, 废话不多说, 直接上例子:
#import <Foundation/Foundation.h> @interface Person : NSObject + (void)load; @end @implementation Person + (void)load { NSLog(@"Person-----load"); } + (void)initialize { NSLog(@"Person-initialize"); } @end @interface Person (XMN) + (void)load; @end @implementation Person (XMN) + (void)load { NSLog(@"Person(XMN)-----load"); } + (void)initialize { NSLog(@"Person(XMN)-initialize"); } @end int main() { return 0; }
结果:
2015-01-24 14:44:37.224 07-类的本质[10784:1172004] Person----load 2015-01-24 14:44:37.225 07-类的本质[10784:1172004] Person(XMN)-----load
刚刚我们也说了, load方法在程序启动的时候就会把项目中所有的类都加载一遍, 这个就没什么好探讨的, 下面继续:
int main() { [[Person alloc]init]; return 0; }
结果:
2015-01-24 14:46:41.691 07-类的本质[10792:1173167] Person----load 2015-01-24 14:46:41.692 07-类的本质[10792:1173167] Person(XMN)-----load 2015-01-24 14:46:41.692 07-类的本质[10792:1173167] Person(XMN)-initialize
在这里, 就只会调用类别的initialize方法, 就算Person本来就又inititalize方法, 也会覆盖掉原来的方法, 这一点就比较特殊, 我们需要留意一下
再重复一次:
1. 在程序启动时, 就会加载项目中所有的类和类别, 而且加载后会调用每个类和类别的load方法, 并且只会调用一次.
2. 当第一次调用某个类的时候, 就会调用当前类的initialize方法, 如果该类有类别, 并且有initialize方法, 那么就只会使用类别的initialize方法.
3. 先加载父类, 后加载子类, (先调用父类的+load方法, 再调用子类的+load方法)
4. 先初始化父类, 再初始化子类(先调用父类的+initialize方法, 再调用子类的+initialize方法)
好了, 这次我们就说到这里, 下次我们继续~~