對(duì)[person PersonMethod]進(jìn)行了追蹤厨相,主要認(rèn)識(shí):
1.objc_class類cache 緩存了方法imp 如何緩存沒(méi)有在class_rw_t中查找,然后保存到cache成員中鸥鹉。
class_rw_t中保存method_array_t是 count后面list *list[0] -------list[n]個(gè)指針,指向和一起一樣的method_list_t 結(jié)構(gòu)體庶骄,這個(gè)method_t first 后面跟著第2個(gè)第3個(gè)第n個(gè)struct method_t方法毁渗,其中entsize_list_tt->count 是成員方法的個(gè)數(shù)。
在查找過(guò)程中如果本類沒(méi)有单刁,會(huì)在upclass進(jìn)行查找灸异。
2. 一個(gè)對(duì)象即instance,是同個(gè)alloc函數(shù)在執(zhí)行過(guò)程中分配的地址的羔飞,一個(gè)instance最小為16個(gè)字節(jié)肺樟,instance size 可以在class_ro_t中查找到的,分配時(shí)候就是分配instance size大小的內(nèi)存逻淌。alloc 一個(gè)對(duì)象之后需要設(shè)置isa成員么伯,這是同個(gè)調(diào)用obj->initInstaceIsa,這個(gè)對(duì)象的方法卡儒,這個(gè)c++類方法田柔,在匯編層面是%rdi =對(duì)象指針(obj)俐巴;%rsi =cls ;%rdx=hasCxxDtor硬爆;相對(duì)于多了個(gè)對(duì)象指針欣舵,這既是this指針,因?yàn)檫@個(gè)方法函數(shù)是屬于ojb的缀磕,所以在匯編時(shí)候缘圈,maycar->modify(2000)為modify(&car,2000)袜蚕,price 成員也變成了this->price 了糟把。這里initstance函數(shù)同意“::”類方面的調(diào)用,說(shuō)要可以看到isa=newisa這樣的語(yǔ)句廷没,這個(gè)isa沒(méi)有看到的定義糊饱,因?yàn)樗莖bj結(jié)構(gòu)的一個(gè)成員,所以直接引用颠黎。
3.isa_t結(jié)構(gòu)另锋,這個(gè)是一個(gè)指針的封裝,可以解讀出來(lái)對(duì)象地址狭归,或其他什么東西因?yàn)樗且粋€(gè)union夭坪,成員有5個(gè),index是0表示raw isa 也就是沒(méi)有結(jié)構(gòu)體的部分过椎,訪問(wèn)對(duì)象isa會(huì)直接返回一個(gè)指向cls的指針室梅,為1表示當(dāng)前isa 不是指針,其中也有cls的信息疚宇,只是關(guān)于類的指針保存在shifcls中亡鼠。
小技巧: p ?(class_rw_t *)cls; ?p/x $1024; ?x/20xw ?0x0000100d100f8; 在看c代碼的時(shí)候,看不懂的調(diào)用方式和語(yǔ)法結(jié)構(gòu)直接在匯編層面進(jìn)行解答敷待,逐個(gè)分析每個(gè)rdi中的值對(duì)應(yīng)的是哪個(gè)對(duì)象或類间涵,本次就是發(fā)現(xiàn)了調(diào)用函數(shù)時(shí)候多了一個(gè)obj指針,發(fā)現(xiàn)了有this指針這個(gè)東西榜揖。匯編是你真正的朋友勾哩,不是什么狗屁參考書(shū)。
參考文章:(感謝文章作者)
1.深入解析 ObjC 中方法的結(jié)構(gòu)举哟。http://www.reibang.com/p/d7a60fc7b0a1
?2.深入解構(gòu)objc_msgSend函數(shù)的實(shí)現(xiàn) 思劳。http://www.reibang.com/p/df6629ec9a25
?3.從 NSObject 的初始化了解 isa 。https://blog.csdn.net/fishmai/article/details/71158083
?4.【iOS 底層原理】struct objc_class 的結(jié)構(gòu).?http://www.reibang.com/p/4f732bd01f27
? 5.C++ this指針(直戳本質(zhì))http://c.biancheng.net/view/170.html