iOS 實(shí)例對象,類對象,元類對象的關(guān)聯(lián)---isa/superclass指針(2)

一.isa指針

  • 上篇文章我們提到了實(shí)例對象,類對象和元類對象的存儲結(jié)構(gòu)里面都包含了一個isa指針,今天我們來看看它的作用,以及實(shí)例對象類對象元類對象之間的關(guān)聯(lián)

復(fù)習(xí)
  • 實(shí)例對象的isa指針

    • 當(dāng)實(shí)例對象(instance)調(diào)用對象方法的時候,實(shí)例對象的isa指針指向類對象(class),在類對象中,查找對象方法并調(diào)用
  • 類對象的isa指針

    • 類對象(class)的isa指針指向元類對象(meta-class),當(dāng)調(diào)用類方法時,類對象的isa指針指向元類對象,并在元類里面找到類方法并調(diào)用


      指向關(guān)系

二.類對象的superclass 指針

  • 先兩個類,一個Person繼承自NSObject,一個類繼承自Person
/// Person繼承自NSObject
@interface Person : NSObject
-(void)perMethod;
+(void)perEat;
@end

@implementation Person

-(void)perMethod{
    
}
+(void)perEat{
    
}

@end



/// student繼承自Person
@interface Student : Person
-(void)StudentMethod;
+(void)StudentEat;
@end
@implementation Student

-(void)StudentMethod{
    
}
+(void)StudentEat{
    
}

  • 當(dāng)實(shí)例對象調(diào)用自身的對象方法時,它在自身的class對象中找到StudentMethod方法
        Student *student = [[Student alloc]init];
        [student StudentMethod]
  • 當(dāng)實(shí)例對象調(diào)用父類的方法的時候
        Student *student = [[Student alloc]init];
        [student perMethod];
superclass指向

當(dāng)子類調(diào)用父類的實(shí)例方法的時候,子類的class類對象的superclass指針指向父類,直至基類(NSObject)找到方法并執(zhí)行(注意,這里指的是實(shí)例方法,也就是減號方法)

三.元類對象的superclass 指針

當(dāng)子類調(diào)用父類的類方法的時候,子類的superclass指向父類,并查找到相應(yīng)的類方法,調(diào)用

[Student perEat];
元類對象的superclass指針指向
  • 總的來說,isa,superclass的的關(guān)系可以用一副經(jīng)典的圖來表示


    圖片來源于網(wǎng)絡(luò)

instance的isa指向class

class的isa指向meta-class

meta-class的isa指向基類的meta-class

class的superclass指向父類的class

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容