OC中類的本質(zhì)總結(jié)

1.什么是類加載?

在創(chuàng)建對象的時候,肯定是需要訪問類的.所以在程序運行期間,當某個類第一次被訪問到的時候,會將這個類存儲到內(nèi)存中的代碼段區(qū)域,這個過程叫做類加載.

只有類在第一次被訪問的時候,才會做類加載,一旦類被加載到代碼段以后,直到程序結(jié)束的時候才會被釋放.

2.類對象的獲取方式和在內(nèi)存中存儲的信息包括哪些?

獲取類對象方式和類對象在內(nèi)存中存儲的信息

3.類對象在內(nèi)存中的真實結(jié)構(gòu)(struct objc_class)

struct objc_class 的本質(zhì)結(jié)構(gòu)

4.元類對象(meta - class)的獲取方式?

ps:只有通過object_getClass()這個RuntimeAPI才能獲取meta-class對象 , 無論使用多少次class方法只能獲取class對象.

元類對象的獲取方式


元類對象打印的地址值 是不同于類對象的

5.元類(meta-class)對象的內(nèi)部結(jié)構(gòu)


元類對象的內(nèi)部結(jié)構(gòu)

meta-class對象和class對象的內(nèi)存結(jié)構(gòu)是一樣的,只是說在meta-class對象中的類方法信息是有值的,而class對象中的類方法信息是null,同樣在class對象中屬性信息、對象方法信息、協(xié)議信息、成員變量信息這些是有值的,而類方法信息是null.

6.關(guān)于返回類對象還是元類對象的方法總結(jié)

1.Class objc_getClass(const char *aClassName)

1>傳入字符串對象

2>返回對應(yīng)的類對象

2.Class object_getClass(id obj)

1>傳入的obj是OC對象,OC對象包括instance對象、class對象、meta-class對象.

2>返回值

a.如果是instance對象,返回class對象.

b.如果是class對象,返回meta-class對象.

c.如果是meta-class對象,返回NSObject(基類)的meta-class對象.

3.-(Class)class、+(Class)class

1>返回的就是類對象

7.關(guān)于isa、superclass總結(jié)

isa、superclass的總結(jié)

1)instance調(diào)用對象方法的軌跡

通過isa指針找到class對象,如果class對象里這個對象方法不存在,就通過superclass指針找父類class對象,如果沒有就一直通過superclass指針找父類class對象,一直找到NSObject類對象,NSObject類對象里還沒有要找的對象方法,就報unrecognized selector sent to class.

2)class調(diào)用類方法的軌跡

通過isa指針找到元類對象,如果類方法不存在,就通過superclass指針找父元類對象,一直找到NSObject元類對象,如果NSObject元類對象也沒有這個類方法,還會通過superclass指針去找NSObject類對象,如果NSObject類對象里還是沒有要找的類方法,就報錯.

8.對象的isa指針指向哪里?

1)instance對象的isa指向class對象.

2)class對象的isa指向meta_class對象.

3)meta-class對象的isa指向基類的meta-class對象.

9.OC的類信息存放在哪里?

1)對象方法、屬性、成員變量、協(xié)議信息,存放在類對象里.

2)類方法,存放在meta-class對象中.

3)成員變量的具體值,存放在instance對象中.

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

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