Objective

补充一个加载过程的知识点, 那就是类别的加载过程, 类别的加载过程有一些特殊, 废话不多说, 直接上例子:


#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方法)





好了, 这次我们就说到这里, 下次我们继续~~

原文地址:https://www.cnblogs.com/iOSCain/p/4282833.html