一、Objective-C中的對象,簡稱OC對象,主要可以分為3種
- instance對象(實例對象)
- class對象(類對象)
- meta-class對象(元類對象)
二、instance
instance對象就是通過類alloc出來的對象,每次調用alloc都會產生新的instance對象
NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];
- object1、object2是NSObject的instance對象(實例對象)
- 它們是不同的兩個對象,分別占據著兩塊不同的內存
- instance對象在內存中存儲的信息包括
isa指針
其他成員變量
三、class
- objectClass1 ~ objectClass5都是NSObject的class對象(類對象)
- 它們是同一個對象。每個類在內存中有且只有一個class對象
- class對象在內存中存儲的信息主要包括
isa指針
superclass指針
類的屬性信息(@property)、類的對象方法信息(instance method)
類的協議信息(protocol)、類的成員變量信息(ivar)
四、meta-class
objectMetaClass是NSObject的meta-class對象(元類對象)
每個類在內存中有且只有一個meta-class對象
meta-class對象和class對象的內存結構是一樣的,但是用途不一樣,在內存中存儲的信息主要包括
isa指針
superclass指針
類的類方法信息(class method)
五、注意
-
以下代碼獲取的objectClass是class對象,并不是meta-class對象
7.png -
查看Class是否為meta-class
8.png -
object_getClass與objc_getClass的區別
1.Class objc_getClass(const char *aClassName)
1> 傳入字符串類名
2> 返回對應的類對象2.Class object_getClass(id obj)
1> 傳入的obj可能是instance對象、class對象、meta-class對象
2> 返回值
a) 如果是instance對象,返回class對象
b) 如果是class對象,返回meta-class對象
c) 如果是meta-class對象,返回NSObject(基類)的meta-class對象3.- (Class)class、+ (Class)class
返回的就是類對象-(Class) {
return self->isa;
}+(Class) {
return self;
}
六、isa
instance的isa指向class
當調用對象方法時,通過instance的isa找到class,最后找到對象方法的實現進行調用class的isa指向meta-class
當調用類方法時,通過class的isa找到meta-class,最后找到類方法的實現進行調用
七、superclass
1、 class對象的superclass指針
當Student的instance對象要調用Person的對象方法時,會先通過isa找到Student的class,然后通過superclass找到Person的class,最后找到對象方法的實現進行調用
2、 meta-class對象的superclass指針
當Student的class要調用Person的類方法時,會先通過isa找到Student的meta-class,然后通過superclass找到Person的meta-class,最后找到類方法的實現進行調用
3、 isa、superclass總結
- 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調用對象方法的軌跡
isa找到class,方法不存在,就通過superclass找父類 -
class調用類方法的軌跡
isa找meta-class,方法不存在,就通過superclass找父類
12.png
八、class的結構
1、isa指針
- 從64bit開始,isa需要進行一次位運算,才能計算出真實地址
2、objc4源碼下載
-
class、meta-class對象的本質結構都是struct objc_class
15.png
3、窺探struct objc_class的結構
九、面試題
1、對象的isa指針指向哪里?
instance對象的isa指向class對象
class對象的isa指向meta-class對象
meta-class對象的isa指向基類的meta-class對象
2、OC的類信息存放在哪里?
對象方法、屬性、成員變量、協議信息,存放在class對象中
類方法,存放在meta-class對象中
成員變量的具體值,存放在instance對象