iOS開發(fā)(4)OC對(duì)象的分類

一、Objective-C中的對(duì)象,簡(jiǎn)稱OC對(duì)象,主要可以分為3種

  • instance對(duì)象(實(shí)例對(duì)象)
  • class對(duì)象(類對(duì)象)
  • meta-class對(duì)象(元類對(duì)象)

二、instance

instance對(duì)象就是通過類alloc出來的對(duì)象,每次調(diào)用alloc都會(huì)產(chǎn)生新的instance對(duì)象

NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];
  • object1、object2是NSObject的instance對(duì)象(實(shí)例對(duì)象)
  • 它們是不同的兩個(gè)對(duì)象,分別占據(jù)著兩塊不同的內(nèi)存
  • instance對(duì)象在內(nèi)存中存儲(chǔ)的信息包括
    isa指針
    其他成員變量
1.png
2.png

三、class

3.png
  • objectClass1 ~ objectClass5都是NSObject的class對(duì)象(類對(duì)象)
  • 它們是同一個(gè)對(duì)象。每個(gè)類在內(nèi)存中有且只有一個(gè)class對(duì)象
  • class對(duì)象在內(nèi)存中存儲(chǔ)的信息主要包括
    isa指針
    superclass指針
    類的屬性信息(@property)、類的對(duì)象方法信息(instance method)
    類的協(xié)議信息(protocol)、類的成員變量信息(ivar)
4.png

四、meta-class

5.png
  • objectMetaClass是NSObject的meta-class對(duì)象(元類對(duì)象)

  • 每個(gè)類在內(nèi)存中有且只有一個(gè)meta-class對(duì)象

  • meta-class對(duì)象和class對(duì)象的內(nèi)存結(jié)構(gòu)是一樣的,但是用途不一樣,在內(nèi)存中存儲(chǔ)的信息主要包括
    isa指針
    superclass指針
    類的類方法信息(class method)

6.png

五、注意

  • 以下代碼獲取的objectClass是class對(duì)象,并不是meta-class對(duì)象


    7.png
  • 查看Class是否為meta-class


    8.png
  • object_getClass與objc_getClass的區(qū)別
    1.Class objc_getClass(const char *aClassName)
    1> 傳入字符串類名
    2> 返回對(duì)應(yīng)的類對(duì)象

    2.Class object_getClass(id obj)
    1> 傳入的obj可能是instance對(duì)象、class對(duì)象、meta-class對(duì)象
    2> 返回值
    a) 如果是instance對(duì)象,返回class對(duì)象
    b) 如果是class對(duì)象,返回meta-class對(duì)象
    c) 如果是meta-class對(duì)象,返回NSObject(基類)的meta-class對(duì)象

    3.- (Class)class、+ (Class)class
    返回的就是類對(duì)象

    -(Class) {
    return self->isa;
    }

    +(Class) {
    return self;
    }

六、isa

9.png
  • instance的isa指向class
    當(dāng)調(diào)用對(duì)象方法時(shí),通過instance的isa找到class,最后找到對(duì)象方法的實(shí)現(xiàn)進(jìn)行調(diào)用

  • class的isa指向meta-class
    當(dāng)調(diào)用類方法時(shí),通過class的isa找到meta-class,最后找到類方法的實(shí)現(xiàn)進(jìn)行調(diào)用

七、superclass

1、 class對(duì)象的superclass指針


10.png

當(dāng)Student的instance對(duì)象要調(diào)用Person的對(duì)象方法時(shí),會(huì)先通過isa找到Student的class,然后通過superclass找到Person的class,最后找到對(duì)象方法的實(shí)現(xiàn)進(jìn)行調(diào)用

2、 meta-class對(duì)象的superclass指針


11.png

當(dāng)Student的class要調(diào)用Person的類方法時(shí),會(huì)先通過isa找到Student的meta-class,然后通過superclass找到Person的meta-class,最后找到類方法的實(shí)現(xiàn)進(jìn)行調(diào)用

3、 isa、superclass總結(jié)

  • instance的isa指向class
  • class的isa指向meta-class
  • meta-class的isa指向基類的meta-class
  • class的superclass指向父類的class
    如果沒有父類,superclass指針為nil
  • meta-class的superclass指向父類的meta-class
    基類的meta-class的superclass指向基類的class
  • instance調(diào)用對(duì)象方法的軌跡
    isa找到class,方法不存在,就通過superclass找父類
  • class調(diào)用類方法的軌跡
    isa找meta-class,方法不存在,就通過superclass找父類


    12.png

八、class的結(jié)構(gòu)

1、isa指針


13.png
  • 從64bit開始,isa需要進(jìn)行一次位運(yùn)算,才能計(jì)算出真實(shí)地址
14.png

2、objc4源碼下載

3、窺探struct objc_class的結(jié)構(gòu)


16.png

九、面試題

1、對(duì)象的isa指針指向哪里?
instance對(duì)象的isa指向class對(duì)象
class對(duì)象的isa指向meta-class對(duì)象
meta-class對(duì)象的isa指向基類的meta-class對(duì)象

2、OC的類信息存放在哪里?
對(duì)象方法、屬性、成員變量、協(xié)議信息,存放在class對(duì)象中
類方法,存放在meta-class對(duì)象中
成員變量的具體值,存放在instance對(duì)象

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

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