ios分類主要是將類的一些類似的功能拆分出去,使得每個分類中的函數(shù)功能統(tǒng)一。
我們經(jīng)常會遇到分類中重寫了原類方法導(dǎo)致原類中的方法被覆蓋了,category的底層實現(xiàn)是在加載的時候,把category中的方法添加到原類的方法列表中,當(dāng)調(diào)用方法時會遍歷方法列表找到對應(yīng)的響應(yīng)子就返回,不再向下遍歷。因為category的優(yōu)先級高于類的優(yōu)先級,使得原類中的選擇子遍歷不到。
聲明一個TestViewController


類中實現(xiàn)了一個test方法
添加兩個分類
TestViewController(ca1)


TestViewController (ca2)


從上面代碼中可以看出,兩個分類都實現(xiàn)了test方法
當(dāng)用[self test]調(diào)用test方法時,調(diào)用的是分類里面的方法

當(dāng)需要調(diào)用TestViewController中的test方法時,可以去遍歷方法列表,去查詢最后一個test方法的selector,然后獲取方法的指針地址來執(zhí)行方法

((void (*)(id, SEL))imp)(self,sel);
((void (*)(id,SEL))objc_msgSend)(self, selector);
第一行代碼是通過方法的IMP來執(zhí)行方法,
第二行代碼是通過消息發(fā)送的形式objc_msgSend的方法去執(zhí)行方法
可以去了解一下方法的IMP和selector的區(qū)別