load方法和initialize方法
load方法在runtime的初始化时调用,也就是_objc_init方法中被调用
image.png image.pngcall_load_methods()函数中调用load方法。
load方法的调用顺序是先调用所有类的load方法,再调用分类的load方法。
image.png调用load方法之前会先递归遍历其父类,先调用父类的load方法:
image.png总结load的调用特点:
1.先调用父类的load方法,再调用子类的load方法,最后调用分类的load方法。
2.对于类与类之间的先后顺序看编译顺序。
3.分类和类的load方法都会调用
4.load方法调用发生在Runtime初始化,main函数之前
load方法调用是通过函数地址调用,而非OC中常用的发送消息机制,每一个类有且只有调用一次(除非程序员主动调用)。
b.initialize方法是通过objc_msgsend方式也就是发送消息的方式调用的:
image.png image.pnginitialize的特点:
1.initialize在首次接受到消息时调用。
2.initialize通过objc_msgSend调用。所以遵循OC其他方法调用的特点。如果子类没有实现,会遍历其父类调用其父类的实现。
3.由于第二条特点,一个initialize的调用可能不止一次。
4.由于initialize是OC方法,所以如果分类实现了initialize实现会覆盖主类的实现。
网友评论