OC类的探究分析三:成员变量和类方法

承接上一篇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地址。



isKindOfClass()方法

此处插播OC属性和成员变量的区别

拓展setter方法的底层原理

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容