objc_msgSend 调用的过程分析

instance->class-> meta_clas成员关系图

对[person PersonMethod]进行了追踪,主要认识:

1.objc_class类cache 缓存了方法imp 如何缓存没有在class_rw_t中查找,然后保存到cache成员中。

class_rw_t中保存method_array_t是 count后面list *list[0] -------list[n]个指针,指向和一起一样的method_list_t 结构体,这个method_t first 后面跟着第2个第3个第n个struct method_t方法,其中entsize_list_tt->count 是成员方法的个数。

在查找过程中如果本类没有,会在upclass进行查找。

2. 一个对象即instance,是同个alloc函数在执行过程中分配的地址的,一个instance最小为16个字节,instance size 可以在class_ro_t中查找到的,分配时候就是分配instance size大小的内存。alloc 一个对象之后需要设置isa成员,这是同个调用obj->initInstaceIsa,这个对象的方法,这个c++类方法,在汇编层面是%rdi =对象指针(obj);%rsi =cls ;%rdx=hasCxxDtor;相对于多了个对象指针,这既是this指针,因为这个方法函数是属于ojb的,所以在汇编时候,maycar->modify(2000)为modify(&car,2000),price 成员也变成了this->price 了。这里initstance函数同意“::”类方面的调用,说要可以看到isa=newisa这样的语句,这个isa没有看到的定义,因为他是obj结构的一个成员,所以直接引用。

3.isa_t结构,这个是一个指针的封装,可以解读出来对象地址,或其他什么东西因为他是一个union,成员有5个,index是0表示raw isa 也就是没有结构体的部分,访问对象isa会直接返回一个指向cls的指针,为1表示当前isa 不是指针,其中也有cls的信息,只是关于类的指针保存在shifcls中。

小技巧: p  (class_rw_t *)cls;  p/x $1024;  x/20xw  0x0000100d100f8; 在看c代码的时候,看不懂的调用方式和语法结构直接在汇编层面进行解答,逐个分析每个rdi中的值对应的是哪个对象或类,本次就是发现了调用函数时候多了一个obj指针,发现了有this指针这个东西。汇编是你真正的朋友,不是什么狗屁参考书。


参考文章:(感谢文章作者)

1.深入解析 ObjC 中方法的结构。https://www.jianshu.com/p/d7a60fc7b0a1

 2.深入解构objc_msgSend函数的实现 。https://www.jianshu.com/p/df6629ec9a25

 3.从 NSObject 的初始化了解 isa 。https://blog.csdn.net/fishmai/article/details/71158083

 4.【iOS 底层原理】struct objc_class 的结构. https://www.jianshu.com/p/4f732bd01f27

  5.C++ this指针(直戳本质)http://c.biancheng.net/view/170.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容