1、调用方式
1.1、load是根据函数地址直接调用(编译时调用)。
1.2、initialize是通过objc_msgSend调用(其类或者其子类的第一个方法被执行前调用)。
**共同点:**方法只会被调用一次。
2、调用时机(什么时候会调用)
2.1、load是runtime加载类、分类的时候调用(只会调用一次)。
2.2、initialize是类第一次接收到消息的时候调用,每一个类只会initialize一次(父类的initialize方法可能会被调用多次)。
3. 调用顺序
3.1、load
3.1.1、先调用类的load(先编译的类先调用)
3.1.2、调用子类的load之前,先调用父类的load
3.1.3、再调用分类的load(先编译的分类先调用)
3.2、Initialize
3.2.1、先初始化父类。
3.2.2、再初始化子类(可能最终调用的是父类的Initialize的方法(原因:如果子类没有实现Initialize方法时,会通过superclass调用父类的Initialize的方法)))。
3.2.3、如果在分类中也实现了Initialize方法,则会先调用父类的中的方法,再调用分类中的方法,不会调用本类中的方法,(原因:在运行时(runtime)系统会把分类中的方法插入到原有类的方法数组之前(系统会先创建一个数组将原有类中的方法加入到数组中,在运行时,系统会把分类中的方法插入到数组中(是插入不是添加哦!)))。
总结:
+(void)load +(void)initialize
执行时机 在程序运行后立即执行 在类的方法第一次被调时执行
若自身未定义,是否沿用父类的方法? 否 是
类别中的定义 全都执行,但后于类中的方法 覆盖类中的方法,只执行一个
参考: