一、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指針
其他成員變量


三、class

- 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)

四、meta-class

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)

五、注意
-
以下代碼獲取的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

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指針

當(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指針

當(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指針

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

2、objc4源碼下載
-
class、meta-class對(duì)象的本質(zhì)結(jié)構(gòu)都是struct objc_class
15.png
3、窺探struct objc_class的結(jié)構(gòu)

九、面試題
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ì)象



