每個(gè)分類在編譯后會生成一個(gè)category_t結(jié)構(gòu)體肘习,該結(jié)構(gòu)體中存儲著分類的實(shí)例方法裹唆、類方法拔妥、協(xié)議列表荆萤、屬性等信息
當(dāng)我們運(yùn)行app時(shí)runtime運(yùn)行時(shí)機(jī)制會將每個(gè)分類加到對應(yīng)的類對象和元類對象里面,而且加入的時(shí)候?qū)⒎诸惲斜淼臄?shù)據(jù)倒序取出來矩父,然后將里面的方法列表直接插入到rw_t的前面锉桑,之前原有的方法則挪到了最后面,這也就是為什么分類的方法(相同的方法)會優(yōu)先被調(diào)用窍株,之前說到將分類列表中的數(shù)據(jù)取出來是通過倒序民轴,這樣就說明了后編譯的分類攻柠,優(yōu)先被調(diào)用
class_rw_t與class_ro_t的區(qū)別:class_ro_t存儲著類對象/元類原有的信息(方法、屬性后裸、協(xié)議等)瑰钮,也就是編譯后就生成的數(shù)據(jù)(通過源碼可以看出是調(diào)用realizeClass之前),class_rw_t存儲著class_ro_t加上分類的信息微驶,這里的數(shù)據(jù)可以修改浪谴,是運(yùn)行時(shí)才創(chuàng)建的數(shù)據(jù)(調(diào)用realizeClass之后),而且平時(shí)調(diào)用方法都是從class_rw_t中查找的
分類和類擴(kuò)展的區(qū)別:
????????類擴(kuò)展是在編譯完成后會存儲在class_ro_t中因苹,而分類在編譯完成后只是一個(gè)個(gè)獨(dú)立的category_t結(jié)構(gòu)體苟耻,在運(yùn)行時(shí)才會創(chuàng)建class_rw_t,并且將class_ro_t的數(shù)據(jù)拷貝到class_rw_t中扶檐,分類的數(shù)據(jù)也會存儲在class_rw_t中