instance的isa指向class
當(dāng)調(diào)用對象方法時,通過instance的isa找到class,最后找到對象方法的實(shí)現(xiàn)進(jìn)行調(diào)用
class的isa指向meta-class
當(dāng)調(diào)用類方法時,通過class的isa找到meta-class,最后找到類方法的實(shí)現(xiàn)進(jìn)行調(diào)用
類對象的superClass指針
當(dāng)student的instance對象要調(diào)用Person對象的對象方法時,會先通過isa找到sudent的class,然后通過superclass指針找到person的class,最后找到對象方法的實(shí)現(xiàn)進(jìn)行調(diào)用
元類對象的superclass指針
當(dāng)student的class要調(diào)用Person的類方法的時候,會先通過isa找到student的meta-class,然后通過superclass指針找到Person的meta-class,最后找到類方法的實(shí)現(xiàn)進(jìn)行調(diào)用
從上圖可知:
實(shí)例對象的isa指針指向類對象
類對象的isa指針指向元類對象
元類對象的isa指針指向基類的元類(根源類)
類對象的superClass指針指向父類的Class
如果沒有父類,superClass指針為nil
元類的superClass指針指向父類的元類對象
基類的元類(根源類)的superClass指向基類的class (NSobject)
假如 Student 繼承Person Person繼承NSObject
Student實(shí)例S調(diào)用test方法 會到Person當(dāng)中找 如果沒有 則到NSObject當(dāng)中找
如果發(fā)送消息到類對象Student中找類方法 則會到元類中找 元類中找不到則會到根源類,如果沒有到NSObject中找 如果再沒有找到的話會找對象方法
查找方法流程 不管是+方法還是-方法
isa -》superClass -> superClass -> superClass
實(shí)例對象的isa地址 &ISA_MASK后得到類的地址 類的isa地址 需要 & ISA_MASK得到元類的地址 元類的isa地址&ISA_MASK得到根源類的地址
但是superClass指針就是父類的地址