Objective-C基礎學習之類的本質

1.類的本質

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

2.如何獲取類對象

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

3.類對象的用法

  • 用來調用類方法
[Dog test];

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

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

4.類對象的存儲

類對象的存儲.png

5.OC實例對象 類對象 元對象之間關系

  • Objective-C是一門面向對象的編程語言宇葱。

    • 每一個對象 都是一個類的實例瘦真。
    • 每一個對象 都有一個名為isa的指針,指向該對象的類。
    • 每一個類??述了一系列它的實例的特點,包括成員變量的列表,成員函數的列表等黍瞧。
    • 每一個對象都可以接受消息,而對象能夠接收的消息列表是保存在它所對應的類中诸尽。
  • 在Xcode中按Shift + Command + O打開文件搜索框,然后輸入NSObject.h和objc.h,可以打開 NSObject的定義頭文件,通過頭文件我們可以看到,NSObject就是一個包含isa指針的結構體,如下圖所示:

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;
};
  • 按照面向對象語言的設計原則,所有事物都應該是對象(嚴格來說 Objective-C并沒有完全做到這一點,因為它有int,double這樣的簡單變量類型)
    • 在Objective-C語言中,每一個類實際上也是一個對象雷逆。每一個類也有一個名為isa的指針弦讽。每一個類都可以接受消息,例如[NSObject new],就是向NSObject這個類發(fā)送名為new的消息。
    • 在Xcode中按Shift + Command + O,然后輸入runtime.h,可以打開Class的定義頭文件,通過頭文件我們可以看到,Class也是一個包含isa指針的結構體,如下圖所示膀哲。(圖中除了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)。

    • 元類保存了類方法的列表某宪。當一個類方法被調用時,元類會首先查找它本身是否有該類方法的實現,如果沒有則該元類會向它的父類查找該方法,直到一直找到繼承鏈的頭仿村。
    • 元類(metaclass)也是一個對象,那么元類的isa指針又指向哪里呢?為了設計上的完整,所有的元類的isa指針都會指向一個根元類(root metaclass)。
    • 根元類(root metaclass)本身的isa指針指向自己,這樣就行成了一個閉環(huán)兴喂。上面說??到,一個對象能夠接收的消息列表是保存在它所對應的類中的蔼囊。在實際編程中,我們幾乎不會遇到向元類發(fā)消息的情況,那它的isa 指針在實際上很少用到。不過這么設計保證了面向對象的干凈,即所有事物都是對象,都有isa指針衣迷。
    • 由于類方法的定義是保存在元類(metaclass)中,而方法調用的規(guī)則是,如果該類沒有一個方法的實現,則向它的父類繼續(xù)查找畏鼓。所以為了保證父類的類方法可以在子類中可以被調用,所以子類的元類會繼承父類的元類,換而言之,類對象和元類對象有著同樣的繼承關系。
  • 下面這張圖或許能夠 讓大家對isa和繼承的關系清楚一些

isa和繼承的關系.png
類的本質isa和繼承的關系.png
  • 上圖中,最讓人困惑的莫過于Root Class了壶谒。在實現中,Root Class是指 NSObject,我們可以從圖中看出:
  • NSObject類對象包括它的對象實例方法云矫。
  • NSObject的元對象包括它的類方法,例如new方法。
  • NSObject的元對象繼承自NSObject類汗菜。
  • 一個NSObject的類中的方法同時也會被NSObject的子類在查找方法時找到让禀。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市陨界,隨后出現的幾起案子巡揍,更是在濱河造成了極大的恐慌,老刑警劉巖菌瘪,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腮敌,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機缀皱,發(fā)現死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門斗这,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人啤斗,你說我怎么就攤上這事×蘖” “怎么了钮莲?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長彼水。 經常有香客問我崔拥,道長,這世上最難降的妖魔是什么凤覆? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任链瓦,我火速辦了婚禮,結果婚禮上盯桦,老公的妹妹穿的比我還像新娘慈俯。我一直安慰自己,他們只是感情好拥峦,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布贴膘。 她就那樣靜靜地躺著,像睡著了一般略号。 火紅的嫁衣襯著肌膚如雪刑峡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天玄柠,我揣著相機與錄音突梦,去河邊找鬼。 笑死羽利,一個胖子當著我的面吹牛宫患,可吹牛的內容都是我干的。 我是一名探鬼主播铐伴,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼撮奏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了当宴?” 一聲冷哼從身側響起畜吊,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎户矢,沒想到半個月后玲献,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年捌年,在試婚紗的時候發(fā)現自己被綠了瓢娜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡礼预,死狀恐怖眠砾,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情托酸,我是刑警寧澤褒颈,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站励堡,受9級特大地震影響谷丸,放射性物質發(fā)生泄漏。R本人自食惡果不足惜应结,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一刨疼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鹅龄,春花似錦揩慕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肛炮,卻和暖如春止吐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背侨糟。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工碍扔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秕重。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓不同,卻偏偏與公主長得像,于是被迫代替她去往敵國和親溶耘。 傳聞我的和親對象是個殘疾皇子二拐,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內容