承接上一篇OC类的探究二:属性和实例方法
先上一个视频Advancements in the Objective-C runtime
从视频中可以的到一个信息,需要在class_ro_t里面找
在class_rw_t里可以看到ro()函数
const class_ro_t *ro() const {
auto v = get_ro_or_rwe();
if (slowpath(v.is<class_rw_ext_t *>())) {
return v.get<class_rw_ext_t *>(&ro_or_rw_ext)->ro;
}
return v.get<const class_ro_t *>(&ro_or_rw_ext);
}
那么尝试$3.ro()baseMethodList,baseProtocols,ivars,baseProperties
打印ivars得到了成员变量subject和两个属性_name、_hobby
那么类方法应该如何去查找呢?
尝试在LGPerson元类里面查找类方法
打印结果可以看出类方法在元类中,下面通过代码验证:
分别打印当前类以及元类里面包含的函数
打印结果可以看出,类里面包含的方法如下:
sayHello()实例方法
obj的get()和set()方法
.cxx_destrucr自动添加析构方法
name的get()和set()方法
元类里面包含:类方法 sayHappy()
获取类方法其实就是:获取类的元类的对象方法
其实不管是类方法还是实例方法,在底层本质都是函数
方法查找流程:
由下图可知,imp2和imp3本应该为空,但是却打印出地址,并且地址完全想同(imp1和imp2的地址很接近)
因为即便找不到也会返回一个_objc_msgForward,
在源码中查找class_getMethodImplementation()方法
在找不到imp的时候,返回_objc_msgForward
所以,即便imp2和imp3为空,依旧可以返回一个imp地址。
此处插播OC属性和成员变量的区别