对[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