類的本質(zhì)

類的本質(zhì)


1.類的本質(zhì)

  • 類的本質(zhì)其實也是一個對象(類對象)
  • 程序中第一次使用該類的時候被創(chuàng)建,在整個程序中只有一份。
  • 此后每次使用都是這個類對象,它在程序運行時一直存在。
  • 類對象是一種數(shù)據(jù)結(jié)構(gòu),存儲類的基本信息:類大小,類名稱,類的版本工腋,繼承層次姨丈,以及消息與函數(shù)的映射表等
  • 類對象代表類,Class類型,對象方法屬于類對象
  • 如果消息的接收者是類名,則類名代表類對象
  • 所有類的實例都由類對象生成,類對象會把實例的isa的值修改成自己的地址,每個實例的isa都指向該實例的類對象

2.如何獲取類對象

  • 通過實例對象
格式:[實例對象   class ];
如:   [dog class];
  • 通過類名獲取(類名其實就是類對象)
格式:[類名 class];
如:[Dog class]

3.類對象的用法

  • 用來調(diào)用類方法
[Dog test];

Class c = [Dog class];
[c test];
  • 用來創(chuàng)建實例對象
Dog *g = [Dog new];

Class c = [Dog class];
Dog *g1 = [c new];

5.OC實例對象 類對象 元對象之間關(guān)系

  • Objective-C是一門面向?qū)ο蟮木幊陶Z言。

    • 每一個對象 都是一個類的實例擅腰。
    • 每一個對象 都有一個名為isa的指針,指向該對象的類蟋恬。
    • 每一個類??述了一系列它的實例的特點,包括成員變量的列表,成員函數(shù)的列表等。
    • 每一個對象都可以接受消息,而對象能夠接收的消息列表是保存在它所對應(yīng)的類中趁冈。
  • 在Xcode中按Shift + Command + O打開文件搜索框歼争,然后輸入NSObject.h和objc.h,可以打開 NSObject的定義頭文件,通過頭文件我們可以看到,NSObject就是一個包含isa指針的結(jié)構(gòu)體,如下圖所示:

NSObject.h
@interface NSObject <NSObject> {
    Class isa  OBJC_ISA_AVAILABILITY;
}
objc.h
/// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class;

/// Represents an instance of a class.
struct objc_object {
    Class isa  OBJC_ISA_AVAILABILITY;
};
  • 按照面向?qū)ο笳Z言的設(shè)計原則,所有事物都應(yīng)該是對象(嚴(yán)格來說 Objective-C并沒有完全做到這一點,因為它有int,double這樣的簡單變量類型)
    • 在Objective-C語言中,每一個類實際上也是一個對象。每一個類也有一個名為isa的指針渗勘。每一個類都可以接受消息,例如[NSObject new],就是向NSObject這個類發(fā)送名為new的消息沐绒。
    • 在Xcode中按Shift + Command + O,然后輸入runtime.h,可以打開Class的定義頭文件,通過頭文件我們可以看到,Class也是一個包含isa指針的結(jié)構(gòu)體,如下圖所示。(圖中除了isa外還有其它成員變量,但那是為了兼容非2.0版的Objective-C的遺留邏輯,大家可以忽略它旺坠。)
runtime.h
struct objc_class {
    Class isa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__
    Class super_class                                        OBJC2_UNAVAILABLE;
    const char *name                                         OBJC2_UNAVAILABLE;
    long version                                             OBJC2_UNAVAILABLE;
    long info                                                OBJC2_UNAVAILABLE;
    long instance_size                                       OBJC2_UNAVAILABLE;
    struct objc_ivar_list *ivars                             OBJC2_UNAVAILABLE;
    struct objc_method_list **methodLists                    OBJC2_UNAVAILABLE;
    struct objc_cache *cache                                 OBJC2_UNAVAILABLE;
    struct objc_protocol_list *protocols                     OBJC2_UNAVAILABLE;
#endif

} OBJC2_UNAVAILABLE;
  • 因為類也是一個對象,那它也必須是另一個類的實例,這個類就是元類 (metaclass)乔遮。

    • 元類保存了類方法的列表。當(dāng)一個類方法被調(diào)用時,元類會首先查找它本身是否有該類方法的實現(xiàn),如果沒有則該元類會向它的父類查找該方法,直到一直找到繼承鏈的頭取刃。
    • 元類(metaclass)也是一個對象,那么元類的isa指針又指向哪里呢?為了設(shè)計上的完整,所有的元類的isa指針都會指向一個根元類(root metaclass)蹋肮。
    • 根元類(root metaclass)本身的isa指針指向自己,這樣就行成了一個閉環(huán)。上面說??到,一個對象能夠接收的消息列表是保存在它所對應(yīng)的類中的璧疗。在實際編程中,我們幾乎不會遇到向元類發(fā)消息的情況,那它的isa 指針在實際上很少用到坯辩。不過這么設(shè)計保證了面向?qū)ο蟮母蓛?即所有事物都是對象,都有isa指針。
    • 由于類方法的定義是保存在元類(metaclass)中,而方法調(diào)用的規(guī)則是,如果該類沒有一個方法的實現(xiàn),則向它的父類繼續(xù)查找崩侠。所以為了保證父類的類方法可以在子類中可以被調(diào)用,所以子類的元類會繼承父類的元類,換而言之,類對象和元類對象有著同樣的繼承關(guān)系漆魔。
  • 下面這張圖或許能夠 讓大家對isa和繼承的關(guān)系清楚一些

關(guān)系圖.png
  • 上圖中,最讓人困惑的莫過于Root Class了。在實現(xiàn)中,Root Class是指
    NSObject,我們可以從圖中看出:
  • NSObject類對象包括它的對象實例方法。
  • NSObject的元對象包括它的類方法,例如new方法有送。
  • NSObject的元對象繼承自NSObject類淌喻。
  • 一個NSObject的類中的方法同時也會被NSObject的子類在查找方法時找到。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末雀摘,一起剝皮案震驚了整個濱河市裸删,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌阵赠,老刑警劉巖涯塔,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異清蚀,居然都是意外死亡匕荸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門枷邪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來榛搔,“玉大人,你說我怎么就攤上這事东揣〖螅” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵嘶卧,是天一觀的道長尔觉。 經(jīng)常有香客問我,道長芥吟,這世上最難降的妖魔是什么侦铜? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮钟鸵,結(jié)果婚禮上钉稍,老公的妹妹穿的比我還像新娘。我一直安慰自己棺耍,他們只是感情好嫁盲,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著烈掠,像睡著了一般羞秤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上左敌,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天瘾蛋,我揣著相機與錄音,去河邊找鬼矫限。 笑死哺哼,一個胖子當(dāng)著我的面吹牛佩抹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播取董,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼棍苹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了茵汰?” 一聲冷哼從身側(cè)響起枢里,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蹂午,沒想到半個月后栏豺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡豆胸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年奥洼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晚胡。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡灵奖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出估盘,到底是詐尸還是另有隱情瓷患,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布忿檩,位于F島的核電站尉尾,受9級特大地震影響爆阶,放射性物質(zhì)發(fā)生泄漏燥透。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一辨图、第九天 我趴在偏房一處隱蔽的房頂上張望班套。 院中可真熱鬧,春花似錦故河、人聲如沸吱韭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽理盆。三九已至,卻和暖如春凑阶,著一層夾襖步出監(jiān)牢的瞬間猿规,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工宙橱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留姨俩,地道東北人蘸拔。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像环葵,于是被迫代替她去往敵國和親调窍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 前言 今天整理了下自己電腦里的一些碎片筆記张遭,時間有限只整理了這篇文章——類的本質(zhì)邓萨,大家可以進(jìn)行參考。 1.本質(zhì) 類...
    VV木公子閱讀 2,161評論 3 17
  • 1.類的本質(zhì) 類的本質(zhì)其實也是一個對象(類對象)程序中第一次使用該類的時候被創(chuàng)建帝璧,在整個程序中只有一份先誉。此后每次使...
    GSChan閱讀 3,103評論 0 13
  • 類本身也是一個對象,是class類型的對象. objc_class結(jié)構(gòu)體的定義: 假設(shè)我們創(chuàng)建一個Person類:...
    Colleny_Z閱讀 1,101評論 0 3
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉的烁,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,721評論 0 9
  • 5月13日褐耳,數(shù)家歐洲機構(gòu)近日遭遇大規(guī)模的敲詐軟件攻擊。相關(guān)的報告聲稱渴庆,受到攻擊的團(tuán)體在網(wǎng)上分享了計算機被鎖死并要求...
    小立狐貍閱讀 306評論 0 0