1 通过Runtime动态将分类的方法合并到类对象,元类对象中。
2 扩展在编译的时候就已经合并的到类对象中
if(MJStudent没有初始化) {
if(MJPerson没有初始化)
objc_msgSend([MJPerson class],@selector(initialize));
}
objc_msgSend([MJStudent class],@selector(initialize))
load initialize方法的区别是什么:
1调用方式:
1> load是根据函数地址直接调用
2>initialize是通过objc_msgSend调用
2 调用时刻
1> load是runtime加载类,分类的时候调用(只调用一次)
2>initialize是类第一次接收到消息的时候调用,每一个类只会initialize一次(父类的initialize方法可能会被调用多次)
3 load,initialize的调用顺序
1 load
1>先调用类的load(call_class_loads)
a )先编译的类,优先调用load
b )调用子类的load之前,会先调用父类的load
2> 在调用分类的load
a)先编译的分类,优先调用load
2 initialize
1> 先初始化父类
2>在初始化子类(可能最终调用的是父类的initialize方法)。
全局变量只有一份。