load方法

2019-02-18  本文已影响0人  二斤寂寞

精华总结:Category中有load方法, load方法会在runtime加载类的时候调用

一、代码准备 Demo地址

image.png
image.png

二、运行程序

image.png image.png image.png
void printMethodNamesOfClass(Class cls) {
    unsigned int count;
    // 获取方法数组
    Method *methodList = class_copyMethodList(cls, &count);
    // 存储方法名
    NSMutableString *methodNames = [NSMutableString string];
    // 遍历所有的方法
    for (int i = 0; i < count; i++) {
        // 获得方法
        Method method = methodList[i];
        // 获得方法名
        NSString *methodName = NSStringFromSelector(method_getName(method));
        // 拼接方法名
        [methodNames appendString:methodName];
        [methodNames appendString:@", "];
    }
    // 释放
    free(methodList);
    // 打印方法名
    NSLog(@"%@ %@", cls, methodNames);
}
image.png

三、查看加载+load方法的源码

源码下载

image.png image.png image.png image.png image.png image.png image.png
[Person load];
[Person test];

等价于
objc_msgSend([Person class], @selector(load));
objc_msgSend([Person class], @selector(test));
image.png

四、添加子类和子类的Category

image.png image.png image.png

五、子类的load加载

image.png image.png

六、查看关于类中+(void)load方法的调用顺序源码

image.png image.png image.png image.png image.png image.png image.png

所以, 不论PersonStudent的编译顺序如何调换, Person+(void)load方法会比Student+(void)load方法调用早\

image.png image.png image.png image.png image.png

总结:
Category中有load方法, load方法会在runtime加载类的时候调用
类的load方法调用早于Category中的load方法, 调用子类的load方法之前, 会先调用父类的load方法
没有关系的类会根据编译顺序调用load方法, Category会根据编译顺序调用load方法
所有的类和分类, load方法只会调用一次

七、load方法可以被子类继承吗?

image.png image.png
objc_msgSend([Student class], @selector(load));

总结: load方法可以继承, 但是一般情况下不会主动调用load方法, 都是让系统自动调用

转:小码哥iOS学习笔记第六天: load方法

上一篇 下一篇

猜你喜欢

热点阅读