iOS 類和元類的關(guān)系

事情的始末是這樣的腹殿,同學(xué)想驗證一下resolveClassMethod是否執(zhí)行(resolveClassMethod是一個對象調(diào)用一個不存在類方法時验游,會執(zhí)行此方法轧坎,不懂的要惡補一下了矾瘾,可以看我這篇文章:Objective-C消息轉(zhuǎn)發(fā)),然后發(fā)來了如下代碼:

[NSObject performSelector:@selector(hehe)];

當(dāng)時看完之后產(chǎn)生了疑惑丹鸿,performSelector是一個實例方法,NSObject是一個類棚品,難道編譯不會報錯嗎靠欢?后來親測發(fā)現(xiàn)確實不會報錯廊敌。

然后開始了我們今天的故事:
我們都知道下面這樣寫一定會出錯

@interface TestObject : NSObject
@end
@implementation TestObject
- (void)method1{
       [TestObject method2];//這樣調(diào)用一定會編譯錯誤
}
- (void)method2{}

然而這樣寫卻不會報錯

@interface TestObject : NSObject
@end
@implementation TestObject
- (void)method{
   [NSObject performSelector:@selector(hehe)];
}

甚至于這樣寫也不會報錯
創(chuàng)建一個NSObject的類目

@interface NSObject (hehe)
+(void)run;
@end
@implementation NSObject (hehe)
-(void)run{
    NSLog(@"run.....");
}
@end

然后調(diào)用

[NSObject run];

這是為什么哪?
看一張關(guān)系圖

圖片.png

(此圖來源自網(wǎng)絡(luò))
假設(shè)A類繼承自B類门怪,B類繼承自NSObject
A便是途中的Subclass(class),B便是圖中的Superclass(class),NSObject便是Root class(class);
A *a = [A new];
其實A和a一樣骡澈,也是對象,A稱為類對象掷空,a稱為實例對象
每一個類對象都有一個isa指針

 Class isa  OBJC_ISA_AVAILABILITY;

這個isa指針的指向就是該類對象的元類肋殴,每一個類都是它的元類的對象,元類是對類對象的描述坦弟,就像類是普通實例對象的描述一樣护锤。

每一個類里面聲明的類方法,其本質(zhì)就是把該類方法放到元類的方法列表上面酿傍,所以類在調(diào)用類方法時烙懦,可以想象成是元類的對象在調(diào)用一個實例方法。

A的父類是B赤炒,A的元類的父類是B元類的父類修陡,B的父類是NSObject,NSObject的父類是nil,B元類的父類是NSObject的元類;特別注意的一點可霎,NSObject的元類的父類是NSObject,NSObject的isa指針又指向NSObject的元類魄鸦,所以在NSObject里面的所有方法,NSObject的元類也都擁有癣朗,1拾因、所以用NSObject 調(diào)用任意NSObject里面的實例方法都是可以成功的,2旷余、這也就解釋了上面的聲明里面是+(void)run;類方法绢记,實現(xiàn)里面是-(void)run{ NSLog(@"run.....");}實例方法,調(diào)用卻不會崩潰正卧。

類和元類是一個閉環(huán)蠢熄,實例指向類,類指向元類炉旷,元類指向跟元類签孔,跟元類指向自身,根元類的父類是NSObject

元類是 Class 對象的類窘行。每個類(Class)都有自己獨一無二的元類(每個類都有自己第一無二的方法列表)饥追。這意味著所有的類對象都不同。

NSObject里面的所有實力方法罐盔,任意類都可以通過類方法調(diào)用但绕。

所有的meta-class使用基類的meta-class作為自己的基類,對于頂層基類的meta-class也是一樣,只是它指向自己而已

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捏顺,一起剝皮案震驚了整個濱河市六孵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌幅骄,老刑警劉巖劫窒,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異昌执,居然都是意外死亡烛亦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門懂拾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來煤禽,“玉大人,你說我怎么就攤上這事岖赋∶使” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵唐断,是天一觀的道長选脊。 經(jīng)常有香客問我,道長脸甘,這世上最難降的妖魔是什么恳啥? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮丹诀,結(jié)果婚禮上钝的,老公的妹妹穿的比我還像新娘。我一直安慰自己铆遭,他們只是感情好硝桩,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著枚荣,像睡著了一般碗脊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上橄妆,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天衙伶,我揣著相機與錄音,去河邊找鬼呼畸。 笑死痕支,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蛮原。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼另绩,長吁一口氣:“原來是場噩夢啊……” “哼儒陨!你這毒婦竟也來了花嘶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蹦漠,失蹤者是張志新(化名)和其女友劉穎椭员,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笛园,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡隘击,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了研铆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片埋同。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖棵红,靈堂內(nèi)的尸體忽然破棺而出凶赁,到底是詐尸還是另有隱情,我是刑警寧澤逆甜,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布虱肄,位于F島的核電站,受9級特大地震影響交煞,放射性物質(zhì)發(fā)生泄漏咏窿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一素征、第九天 我趴在偏房一處隱蔽的房頂上張望集嵌。 院中可真熱鬧,春花似錦稚茅、人聲如沸纸淮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咽块。三九已至,卻和暖如春欺税,著一層夾襖步出監(jiān)牢的瞬間侈沪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工晚凿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留亭罪,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓歼秽,卻偏偏與公主長得像应役,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

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