[objc 解釋]:類和元類

翻譯參考鏈接:[objc 解釋]:類和元類

英文原文:[objc explain]: Classes and metaclasses

objc系列文章
http://www.sealiesoftware.com/blog/archive/index.html

Objective-C is a class-based object system. Each object is an instance of some class; the object's isa pointer points to its class. That class describes the object's data: allocation size and ivar types and layout. The class also describes the object's behavior: the selectors it responds to and instance methods it implements.

The class's method list is the set of instance methods, the selectors that the object responds to. When you send a message to an instance, objc_msgSend() looks through the method list of that object's class (and superclasses, if any) to decide what method to call.

Each Objective-C class is also an object. It has an isa pointer and other data, and can respond to selectors. When you call a "class method" like [NSObject alloc], you are actually sending a message to that class object.

Since a class is an object, it must be an instance of some other class: a metaclass. The metaclass is the description of the class object, just like the class is the description of ordinary instances. In particular, the metaclass's method list is the class methods: the selectors that the class object responds to. When you send a message to a class - an instance of a metaclass - objc_msgSend() looks through the method list of the metaclass (and its superclasses, if any) to decide what method to call. Class methods are described by the metaclass on behalf of the class object, just like instance methods are described by the class on behalf of the instance objects.

What about the metaclass? Is it metaclasses all the way down? No. A metaclass is an instance of the root class's metaclass; the root metaclass is itself an instance of the root metaclass. The isa chain ends in a cycle here: instance to class to metaclass to root metaclass to itself. The behavior of metaclass isa pointers rarely matters, since in the real world nobody sends messages to metaclass objects.

More important is the superclass of a metaclass. The metaclass's superclass chain parallels the class's superclass chain, so class methods are inherited in parallel with instance methods. And the root metaclass's superclass is the root class, so each class object responds to the root class's instance methods. In the end, a class object is an instance of (a subclass of) the root class, just like any other object.

Confused? The diagram may help. Remember, when a message is sent to any object, the method lookup starts with that object's isa pointer, then continues up the superclass chain. "Instance methods" are defined by the class, and "class methods" are defined by the metaclass plus the root (non-meta) class.

In proper computer science language theory, a class and metaclass hierarchy can be more free-form, with deeper metaclass chains and multiple classes instantiated from any single metaclass. Objective-C uses metaclasses for practical goals like class methods, but otherwise tends to hide metaclasses. For example, [NSObject class] is identical to [NSObject self], even though in formal terms it ought to return the metaclass that NSObject->isa points to. The Objective-C language is a set of practical compromises; here it limits the class schema before it gets too, well, meta.

下面是翻譯:

Object-C 是基于類的對象系統(tǒng)。每一個對象都是一些類的實例十办;這個對象的 isa 指針指向它所屬的類秀撇。該類描述這個對象的數(shù)據(jù)信息:內(nèi)存分配大小(allocation size)和實例變量的類型(ivar types )與布局(layout)。這個類也描述了對象的行為:它能夠響應的選擇器(selectors)和它實現(xiàn)的實例方法(instance methods)向族。

類的方法列表是一個實例方法的集合(instance methods)呵燕,是對象響應的選擇器(selectors)。當你向一個實例發(fā)送一條消息炸枣,objc_msgSend()查詢對象所屬類(和它的父類虏等,如果有)的方法列表,去決定調(diào)用哪個方法适肠。

每個 Object-C 類也是一個對象霍衫。它有一個 isa 指針和其他數(shù)據(jù),并且可以響應選擇器侯养。當你調(diào)用一個“類方法”敦跌,例如:[NSObject alloc],你實際上是向類對象發(fā)送了一條消息。

由于一個類是一個對象柠傍,它肯定也是其他類的實例麸俘,這個類是元類(metaclass)。元類是關于類對象的描述惧笛,就像類是普通實例對象的描述一樣从媚。實際上,元類的方法列表正是類方法(該類對象響應的選擇器)患整。當你向一個類(元類的實例)發(fā)送消息拜效,objc_msgSend()查詢元類(和它的父類,如果有)的方法列表各谚,去決定調(diào)用哪個方法紧憾。元類為類對象描述類方法,就像類為實例對象描述實例方法一樣昌渤。

元類赴穗?元類鏈是一直向下的嗎?不是膀息,一個元類是根元類的實例般眉;根元類是它自身的實例。isa 指針鏈以一個環(huán)結束:實例指向類-指向元類-指向根元類-到自身履婉。元類的 isa 指針并不重要煤篙,因為在現(xiàn)實世界中,沒人會向元類對象發(fā)送消息毁腿。

元類的父類就要更重要了辑奈。元類的父類鏈平行于類的父類鏈,因此類方法跟實例方法一樣被繼承已烤。并且根元類的父類是根類鸠窗,因此每個類對象都響應根類的實例方法。最后胯究,一個類對象就像其他對象一樣是根類的實例(或子類)稍计。

暈了吧?這個圖肯定會幫助你裕循。記住臣嚣,當一個消息被發(fā)送到任何對象,都會從對象的 isa 指針開始尋找應該調(diào)用的方法剥哑,然后繼續(xù)沿著父類鏈向上尋找硅则。“實例方法”被類定義株婴,“類方法”被元類和根類(非元類)定義怎虫。

在合理的電腦科學語言理論中,一個類和元類的層次結構可以是更自由的形式,像更深的元類鏈以及任何單一的元類實例化多個類大审。Object-C 使用元類實現(xiàn)了類方法這樣的實際目的蘸际,但在其他情況下趨向于隱藏元類。例如徒扶,[NSObject class]等價于[NSObject self]粮彤,盡管按正常的理解它應該返回 NSObject->isa 指向的元類。Object-C 語言有一些實際情況的妥協(xié)姜骡,在這里驾诈,它不能得到類的實際結構,元類溶浴。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市管引,隨后出現(xiàn)的幾起案子士败,更是在濱河造成了極大的恐慌,老刑警劉巖褥伴,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谅将,死亡現(xiàn)場離奇詭異,居然都是意外死亡重慢,警方通過查閱死者的電腦和手機饥臂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來似踱,“玉大人隅熙,你說我怎么就攤上這事『搜浚” “怎么了囚戚?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長轧简。 經(jīng)常有香客問我驰坊,道長,這世上最難降的妖魔是什么哮独? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任拳芙,我火速辦了婚禮,結果婚禮上皮璧,老公的妹妹穿的比我還像新娘舟扎。我一直安慰自己,他們只是感情好恶导,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布浆竭。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪邦泄。 梳的紋絲不亂的頭發(fā)上删窒,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音顺囊,去河邊找鬼肌索。 笑死,一個胖子當著我的面吹牛特碳,可吹牛的內(nèi)容都是我干的诚亚。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼午乓,長吁一口氣:“原來是場噩夢啊……” “哼站宗!你這毒婦竟也來了?” 一聲冷哼從身側響起益愈,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤梢灭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蒸其,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敏释,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年摸袁,在試婚紗的時候發(fā)現(xiàn)自己被綠了钥顽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡靠汁,死狀恐怖蜂大,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情膀曾,我是刑警寧澤县爬,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站添谊,受9級特大地震影響财喳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜斩狱,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一耳高、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧所踊,春花似錦泌枪、人聲如沸爱态。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽倔幼。三九已至,卻和暖如春修壕,著一層夾襖步出監(jiān)牢的瞬間愈捅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工慈鸠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蓝谨,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓青团,卻偏偏與公主長得像譬巫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子督笆,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

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

  • 轉至元數(shù)據(jù)結尾創(chuàng)建: 董瀟偉芦昔,最新修改于: 十二月 23, 2016 轉至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,686評論 0 9
  • 筆者翻譯自[objc explain]: Classes and metaclasses Object-C 是基于...
    MoonBall閱讀 1,288評論 0 6
  • Objective-C語言是一門動態(tài)語言,它將很多靜態(tài)語言在編譯和鏈接時期做的事放到了運行時來處理娃肿。這種動態(tài)語言的...
    有一種再見叫青春閱讀 579評論 0 3
  • Objective-C語言是一門動態(tài)語言烟零,他將很多靜態(tài)語言在編譯和鏈接時期做的事情放到了運行時來處理。這種動態(tài)語言...
    tigger丨閱讀 1,388評論 0 8
  • 老公帶著女兒回老家咸作,以探望婆婆為由。我以大肚子為由宵睦,一個人待在寧波记罚。我希望他們?nèi)ツ沁^上五六天,我想一個人清靜幾天壳嚎。...
    莎莎大小姐閱讀 477評論 0 52