iOS 之OC對(duì)象的分類

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)典圖。

關(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找父類。

?著作權(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)容