由上图可知,Person在接收到test消息时,先调用了+initialize方法,在走test方法的现实。
+initialize是通过消息机制去调用,而load方法是通过函数地址直接找到那个方法调用的~
+initialize方法会在类第一次接收到消息时调用。
由上图可知:+initialize的调用顺序,先调用父类的+initialize,在调用子类的+initialize。
由上图可知:objc_msgSend内部肯定会调用+initialize方法的(objc_msgSend内部判断是不是第一次给类发送消息,如果是第一次给这个类发送消息,objc_msgSend内部就会调用这个类的+initialize方法)
*消息发送机制补充:先通过isa ->找到类对象或者元类对象,找到对应的类对象或者元类对象后,就去寻找方法的实现,找到方法后就展开调用。没找到就通过superClass指针去父类或者父类的元类里面找。
// isa -> 类对象/元类对象,寻找方法,调用。在调用方法之前肯定会先调用+initialize方法
也就是在第一次调用方法之前必须保证先调用+initialize方法
*class_getInstanceMethod是c语言现实的查找方法的~
不管是找对象方法还是类方法,最终现实都会走到上面的结构中。
网友评论