1.编译时所有分类编译成下图结构体对象
2.通过runtime动态将分类方法合并到类对象、元类对象中
3.合并时分类方法在方法数组前面,原来类中方法在方法数组后面,所以优先调用分类方法
4.分类编译晚的在数组前面,分类编译顺序按照build phases中compile sources顺序。
image.png
load
1.+load方法会在runtime加载类、分类时调用
2.每个类、分类的load方法,在程序运行过程中只调用一次
3.调用顺序
(1)先调用类的load
*按照编译顺序调用
*先调用父类load,再调用子类load
(2)在调用分类load
*按照编译顺序调用
initialize
1.initialize方法在对象第一次接收到消息时调用
2.先调用父类initialize(父类之前没收到消息),再调用子类initialize
- initialize通过objc_msgSend调用,所以子类没有实现的话,会调用父类initialize(多个子类没有实现则调用多次)
4.分类实现initialize的话,优先调用分类initialize