Objective-C中的對(duì)象,簡(jiǎn)稱OC對(duì)象,主要分為3種:
?1)instance對(duì)象----實(shí)例對(duì)象
????instance對(duì)象就是通過(guò)類alloc出來(lái)的對(duì)象,每次調(diào)用alloc都會(huì)產(chǎn)生新的instance對(duì)象。
????instance對(duì)象中包含了:
? ? ? ? * isa指針
? ? ? ? * 成員變量的值? ??
2)class對(duì)象----類對(duì)象
? ? 每個(gè)類在內(nèi)存中只有一個(gè)類對(duì)象。可通過(guò)三種方法獲得:
? ? ????1.實(shí)例對(duì)象調(diào)用class方法(Class c1 = [a class])? ?
? ? ????2.類調(diào)用class方法(Class c2 = [Animal class])
? ????? 3.使用object_getClass方法獲?。–lass c3 = object_getClass(a))
? ? class對(duì)象中包含了:
? ? ? ? * isa指針
? ? ? ? * superclass指針
? ? ? ? * 類的屬性信息(@property)
????????* 類的對(duì)象方法信息(instance method)
????????* 類的協(xié)議信息(protocol)
????????* 類的成員變量信息(ivar)
3)meta-class對(duì)象----元類對(duì)象
? ? 每個(gè)類內(nèi)存中只有一個(gè)元類對(duì)象??赏ㄟ^(guò)以下的方法獲取:
? ??Class metaCls = object_getClass([NSObject class]);
? ? 元類對(duì)象和類對(duì)象的內(nèi)存結(jié)構(gòu)是一樣的,但用途不一樣,元類對(duì)象中包含了:
? ? ? ? * isa指針
? ? ? ? * superclass指針
????????* 類的類方法信息(class method)
Tips:元類對(duì)象object_getClass([NSObject?class])來(lái)獲取,不能通過(guò)[[NSObject?class] class]來(lái)獲取。
從上面的知識(shí)我們就可以就看出來(lái):
? ?1. 成員變量具體的值,放在instance對(duì)象(實(shí)例對(duì)象)里。
? ? 2. 屬性信息、對(duì)象方法信息、協(xié)議信息、成員變量信息,放在Class對(duì)象(類對(duì)象)里。
? ? 3. 類方法信息,放在meta-class對(duì)象(元類對(duì)象)里。
根據(jù)信息的存放,我們可以得到對(duì)象方法存儲(chǔ)在class的內(nèi)存里,類方法存在于meta-class內(nèi)存里。
? ? ? ?那么問(wèn)題來(lái)了,假如現(xiàn)在有一個(gè)Animal類的實(shí)例化對(duì)象a1,如果想用a1調(diào)用Animal類的對(duì)象方法animalMethod該如何調(diào)用呢?畢竟,a1是存儲(chǔ)在實(shí)例化對(duì)象instance內(nèi)存中的,而animalMethod方法是存儲(chǔ)于Animal類的內(nèi)存中的。
? ? ? ?實(shí)際上instance實(shí)例的對(duì)象的isa指針指向class,找到class類以后,再在class類中找存儲(chǔ)于其中的對(duì)象方法方法進(jìn)行調(diào)用。
? ? ? ?調(diào)用類方法的過(guò)程也是如此,class類通過(guò)其內(nèi)部的isa指針找到meta-class類中存儲(chǔ)的類方法,然后再進(jìn)行調(diào)用。
至此,就可以回答上面的問(wèn)題了。
調(diào)用[a1?animalMethod]方法的過(guò)程
- (void)animalMethod;方法存在于Animal的class內(nèi)部。
通過(guò)a1(實(shí)例對(duì)象)的isa指針找到Animal的class。
在Animal的class內(nèi)部找到- (void)animalMethod;方法并調(diào)用。
isa、superclass 總結(jié)
下面是一張廣為流傳關(guān)于isa、superclass的經(jīng)典圖。

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