国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【iOS開(kāi)發(fā)】理解OC的類(lèi),父類(lèi),元類(lèi)的關(guān)系

這篇具有很好參考價(jià)值的文章主要介紹了【iOS開(kāi)發(fā)】理解OC的類(lèi),父類(lèi),元類(lèi)的關(guān)系。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

在OC中,有對(duì)象objc,有類(lèi)Class,有父類(lèi)SuperClass,其實(shí)還有一種元類(lèi)MetaClass。在接下來(lái)的RunLoop,消息轉(zhuǎn)發(fā)機(jī)制的學(xué)習(xí)之前需要知道OC類(lèi)和對(duì)象的底層,所以理解類(lèi), 父類(lèi),元類(lèi)的關(guān)系是基礎(chǔ)

1.1 類(lèi)和對(duì)象的關(guān)系

在 Objective-C 中,類(lèi)是對(duì)象的模板或藍(lán)圖,而對(duì)象則是類(lèi)的實(shí)例。每個(gè)對(duì)象都有一個(gè)類(lèi)作為其類(lèi)型,它描述了對(duì)象可以具有的屬性和行為。類(lèi)定義了一組屬性和方法,它們描述了對(duì)象的狀態(tài)和操作。

例如一個(gè)Person類(lèi)

Person *person = [[Person allco] init];
person就是Person實(shí)例化出來(lái)的一個(gè)對(duì)象

2.1 類(lèi)的結(jié)構(gòu)體

在ARC和MRC或多或少都了解過(guò)類(lèi)的實(shí)現(xiàn).

類(lèi)在OC中其實(shí)是一個(gè)指向objc_class的結(jié)構(gòu)體指針

typedef struct objc_class *Class;  
struct objc_class {  
    	Class isa;  
  		Class super_class                       OBJC2_UNAVAILABLE;  // 父類(lèi)
        const char *name                        OBJC2_UNAVAILABLE;  // 類(lèi)名
        long version                            OBJC2_UNAVAILABLE;  // 類(lèi)的版本信息,默認(rèn)為0
        long info                               OBJC2_UNAVAILABLE;  // 類(lèi)信息,供運(yùn)行期使用的一些位標(biāo)識(shí)
        long instance_size                      OBJC2_UNAVAILABLE;  // 該類(lèi)的實(shí)例變量大小
        struct objc_ivar_list *ivars            OBJC2_UNAVAILABLE;  // 該類(lèi)的成員變量列表
        struct objc_method_list **methodLists   OBJC2_UNAVAILABLE;  // 方法定義的列表
        struct objc_cache *cache                OBJC2_UNAVAILABLE;  // 方法緩存
        struct objc_protocol_list *protocols    OBJC2_UNAVAILABLE;  // 協(xié)議鏈表
}; 


2.2 對(duì)象的結(jié)構(gòu)體

typedef struct objc_object {
    Class isa;
} *id;
  • isa 指針:這個(gè)指針指向他所屬的類(lèi)。
  • 對(duì)象的isa指針指向他的類(lèi)。
    每個(gè)對(duì)象都有一個(gè)類(lèi),在Objective-C中,對(duì)象的類(lèi)是isa指針決定的,即 isa 指針指向?qū)ο笏鶎俚念?lèi)。
    person的類(lèi)就是Person

2.2.1 元類(lèi)

觀察類(lèi)的結(jié)構(gòu)體

struct objc_class {  
    	Class isa;  。。。。。。。
}

類(lèi)的結(jié)構(gòu)體里面也有isa指針。實(shí)質(zhì)上,OC中一切都是對(duì)象,這個(gè)類(lèi)含有isa指針,所以,類(lèi)也是一種對(duì)象。

那么類(lèi)的isa指針指向哪里呢?類(lèi)的isa指針指向該類(lèi)的元類(lèi)(MetaClass)。所以,元類(lèi)就是類(lèi)所屬的類(lèi)。

2.2.2 涉及消息轉(zhuǎn)發(fā)機(jī)制

當(dāng)你給對(duì)象發(fā)送消息時(shí),消息是在尋找這個(gè)對(duì)象的類(lèi)的方法列表。
當(dāng)你給類(lèi)發(fā)消息時(shí),消息是在尋找這個(gè)類(lèi)的元類(lèi)的方法列表。

其原理就是 OC對(duì)象在發(fā)送消息時(shí),運(yùn)行時(shí)庫(kù)會(huì)追尋著對(duì)象的isa指針得到對(duì)象所屬的類(lèi)。這個(gè)類(lèi)包含了能應(yīng)用于這個(gè)類(lèi)的所有實(shí)例方法以及指向父類(lèi)的指針,以便可以找到父類(lèi)的實(shí)例方法。運(yùn)行時(shí)庫(kù)檢查這個(gè)類(lèi)和其父類(lèi)的方法列表,找到與消息對(duì)應(yīng)的方法。 編譯器會(huì)將消息轉(zhuǎn)換為消息函數(shù)objc_msgSend進(jìn)行調(diào)用

后續(xù)會(huì)多次出現(xiàn)圖 Instance實(shí)例 metaClass元類(lèi)

【iOS開(kāi)發(fā)】理解OC的類(lèi),父類(lèi),元類(lèi)的關(guān)系

2.2.3 元類(lèi)也有類(lèi)

既然元類(lèi)是個(gè)類(lèi),和之前的類(lèi)一樣也是一個(gè)對(duì)象,那元類(lèi)的類(lèi)是什么呢?

所有的元類(lèi)都使用根元類(lèi)作為他們的類(lèi)。這就意味著所有NSObject的子類(lèi)(大多數(shù)類(lèi))的元類(lèi)都會(huì)以NSObject的元類(lèi)作為他們的類(lèi),根元類(lèi)的 isa 指針指向了它自己。

2.3.4 對(duì)象和Class的 isa指針

isa指針在對(duì)象里面表示某個(gè)對(duì)象是一個(gè)什么類(lèi),person對(duì)象就是一個(gè)Person類(lèi)。

對(duì)于 struct objc_class *類(lèi)型的Class類(lèi)也有isa指針,也就是類(lèi)本身也是一個(gè)對(duì)象,在類(lèi)對(duì)象的isa的指向的類(lèi)叫元類(lèi),類(lèi)方法就定義在元類(lèi)的接口部分。一個(gè)類(lèi)可以有很多的實(shí)例,這些實(shí)例都指向了一個(gè)相同的對(duì)象。

Person可以有Student,Father,person等等等實(shí)例,這些實(shí)例都有isa指針指向Person,而Person的isa指針也有著唯一的元類(lèi)。

【iOS開(kāi)發(fā)】理解OC的類(lèi),父類(lèi),元類(lèi)的關(guān)系文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-437641.html

到了這里,關(guān)于【iOS開(kāi)發(fā)】理解OC的類(lèi),父類(lèi),元類(lèi)的關(guān)系的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【C++】 為什么多繼承子類(lèi)重寫(xiě)的父類(lèi)的虛函數(shù)地址不同?『 多態(tài)調(diào)用匯編剖析』

    【C++】 為什么多繼承子類(lèi)重寫(xiě)的父類(lèi)的虛函數(shù)地址不同?『 多態(tài)調(diào)用匯編剖析』

    ?? 樊梓慕: 個(gè)人主頁(yè) ??? 個(gè)人專(zhuān)欄: 《C語(yǔ)言》 《數(shù)據(jù)結(jié)構(gòu)》 《藍(lán)橋杯試題》 《LeetCode刷題筆記》 《實(shí)訓(xùn)項(xiàng)目》 《C++》 《Linux》《算法》 ?? 每一個(gè)不曾起舞的日子,都是對(duì)生命的辜負(fù) 本篇文章主要是為了解答有關(guān)多態(tài)的那篇文章那塊的一個(gè)奇怪現(xiàn)象,大家還記得這張

    2024年02月19日
    瀏覽(26)
  • typeScript中的類(lèi)以及類(lèi)的限制

    傳統(tǒng)方法中,JavaScript通過(guò)構(gòu)造函數(shù)實(shí)現(xiàn)類(lèi)的概念,通過(guò)原型鏈實(shí)現(xiàn)繼承。而在Es6中,我們終于迎來(lái)了class. typeScript除了實(shí)現(xiàn)了所有Es6中類(lèi)的功能以外,還添加了一些新的用法。 雖然 JavaScript 中有類(lèi)的概念,但是可能大多數(shù) JavaScript 程序員并不是非常熟悉類(lèi),這里對(duì)類(lèi)相關(guān)的概

    2024年02月05日
    瀏覽(43)
  • ios oc button 設(shè)置

    ios oc button 設(shè)置

    Button調(diào)整內(nèi)部的子控件的位置 ? ? ? ? ? ?

    2024年02月16日
    瀏覽(17)
  • 【IOS】oc中property屬性值詳解

    1. atomic與nonatomic atomic :原子屬性確保屬性的讀取和寫(xiě)入操作在多線程環(huán)境中是線程安全的。這意味著,當(dāng)一個(gè)線程正在讀取或?qū)懭雽傩詴r(shí),其他線程不能同時(shí)訪問(wèn)該屬性。雖然這提供了線程安全性,但它也引入了性能開(kāi)銷(xiāo),因?yàn)槊看卧L問(wèn)都需要加鎖和解鎖。 nonatomic :非原子

    2024年02月21日
    瀏覽(18)
  • OC(iOS)中常見(jiàn)的面試題匯整(大全)

    OC(iOS)中常見(jiàn)的面試題匯整(大全)

    你如何理解OC這門(mén)語(yǔ)言的?談一下你對(duì)OC的理解? ??????? ? ? ? ?OC語(yǔ)言是C語(yǔ)言的一個(gè)超集,只是在C語(yǔ)言的基礎(chǔ)上加上了面向?qū)ο蟮恼Z(yǔ)言特征,如:繼承,封裝,多態(tài). ?? ? ??封裝:把屬性和方法封裝成一個(gè)類(lèi),方便我們使用 ?? ? ??多態(tài):不同對(duì)象對(duì)于同一消息的不同響應(yīng),子

    2024年03月18日
    瀏覽(17)
  • 大數(shù)據(jù)、人工智能、機(jī)器學(xué)習(xí)、深度學(xué)習(xí)關(guān)系聯(lián)系前言

    大數(shù)據(jù)、人工智能、機(jī)器學(xué)習(xí)、深度學(xué)習(xí)關(guān)系聯(lián)系前言

    1.大數(shù)據(jù)和人工智能關(guān)系 2.機(jī)器學(xué)習(xí)、深度學(xué)習(xí)、人工智能關(guān)系 3.監(jiān)督學(xué)習(xí)、無(wú)監(jiān)督學(xué)習(xí)、半監(jiān)督學(xué)習(xí)、強(qiáng)化學(xué)習(xí)、遷移學(xué)習(xí)關(guān)系 4.機(jī)器學(xué)習(xí)具體內(nèi)容 1.數(shù)據(jù)驅(qū)動(dòng)的人工智能 :人工智能系統(tǒng)需要大量的數(shù)據(jù)來(lái)進(jìn)行訓(xùn)練和學(xué)習(xí)。大數(shù)據(jù)提供了海量的信息,可以用于訓(xùn)練機(jī)器學(xué)習(xí)

    2024年02月12日
    瀏覽(24)
  • (flutter)黑蘋(píng)果系統(tǒng) Xcode iOS flutter 跑通真機(jī)模擬器 此oc clover 彼oc swift

    (flutter)黑蘋(píng)果系統(tǒng) Xcode iOS flutter 跑通真機(jī)模擬器 此oc clover 彼oc swift

    前段時(shí)間寫(xiě)了關(guān)于flutter的一系列基礎(chǔ)知識(shí)和入門(mén)的一些坑,中間把ios端的項(xiàng)目編譯部署等工作一帶而過(guò),這里我覺(jué)得還是有必要專(zhuān)門(mén)寫(xiě)一篇文章來(lái)講講這個(gè),順便把環(huán)境問(wèn)題也一起說(shuō)了。 我們都知道開(kāi)發(fā)ios應(yīng)用需要用到蘋(píng)果電腦,即使flutter也不例外,flutter編譯構(gòu)建需要Xc

    2024年02月07日
    瀏覽(92)
  • iOS從UI內(nèi)存地址到讀取成員變量(oc/swift)

    開(kāi)發(fā)調(diào)試時(shí),我們發(fā)現(xiàn)bug時(shí)常首先是從UI顯示發(fā)現(xiàn)異常,下一步才會(huì)去定位UI相關(guān)連的數(shù)據(jù)的。XCode有給我們提供一系列debug工具,但是很多人可能還沒(méi)有形成一套穩(wěn)定的調(diào)試流程,因此本文嘗試解決這個(gè)問(wèn)題,順便提出一個(gè) 暴論 :UI顯示異常問(wèn)題只需要兩個(gè)步驟就能完成定位

    2023年04月19日
    瀏覽(20)
  • 從零開(kāi)始理解Linux中斷架構(gòu)(1)-前言

    前言 ???? ? ?前段時(shí)間在轉(zhuǎn)行手?jǐn)]WIFI路由器,搞wifi路由器需要理解網(wǎng)絡(luò)驅(qū)動(dòng)程序,以太網(wǎng)卡驅(qū)動(dòng)程序,無(wú)線WIFI驅(qū)動(dòng)程序,而網(wǎng)卡驅(qū)動(dòng)的關(guān)鍵路徑就在中斷程序中,需要了解NIC設(shè)備驅(qū)動(dòng)程序如何收發(fā)數(shù)據(jù),為了徹底的知道數(shù)據(jù)包是如何二層傳遞上來(lái)的,又需要了解一點(diǎn)Lin

    2024年02月09日
    瀏覽(31)
  • 【C++初階(一)】學(xué)習(xí)前言 命名空間與IO流

    【C++初階(一)】學(xué)習(xí)前言 命名空間與IO流

    本專(zhuān)欄內(nèi)容為:C++學(xué)習(xí)專(zhuān)欄,分為初階和進(jìn)階兩部分。 通過(guò)本專(zhuān)欄的深入學(xué)習(xí),你可以了解并掌握C++。 ??博主csdn個(gè)人主頁(yè):小小unicorn ?專(zhuān)欄分類(lèi):C++ ??代碼倉(cāng)庫(kù):小小unicorn的代碼倉(cāng)庫(kù)?? ??????關(guān)注我?guī)銓W(xué)習(xí)編程知識(shí) C++是基于C語(yǔ)言而產(chǎn)生的,它既可以進(jìn)行C語(yǔ)言的

    2024年02月08日
    瀏覽(28)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包