调用类方法的时候,如果在基类的元类对象里面都没找到对应的类方法现实,就会通过基类的元类对象的superclass指针找到基类的类对象,如果基类的类对象中也没有对应的同名的方法现实,就会报找不到方法的错。不会继续调用基类的superclass指针继续寻找方法的原因是,因为基类的superclass指针为nil
printf函数族中对于%p(内存地址)一般以十六进制整数方式输出指针的值,附加前缀0x,
oc调用方法的本质是发消息
比如:[Person test] 大致相当于 ---> objc_msgSend([Person class], @selector(test));
[NSObject test] 大致相当于 ---> objc_msgSend([NSObject class], @selector(test));
所以最终转成的代码只知道,我给Person这个类或者NSObject这个类发送一条test消息,
但是并没有告诉Person这个类或者NSObject这个类,我给它发送的方法是+开头的方法还是--号开头的方法
所以我们oc调用方法的本质是,它是不会去区分是对象方法还是类方法的,不管是对象方法还是类方法,最终都是通过方法名去找的,所以不知道你调用的这个方法是加号开头的还是减号开头的
总结,person调用test方法,本质就是给person发送了一条test消息
typedef struct objc_class *Class; Class是一个指向结构体的指针(struct objc_class这个对象的指针)
有上图可知,superClass直接指向父类类对象的地址
c++的结构体是可以继承的比如:struct objc_class : objc_object {}也可以说c++的结构体跟类几乎没区别。也就是struct objc_class : objc_object可以看成是@interface objc_class : objc_object