消息機(jī)制筆記

從這個(gè)經(jīng)典的案列入手


@implementation Son : Father
- (id)init
{
    self = [super init];
    if (self)
    {
        NSLog(@"%@", NSStringFromClass([self class]));
        NSLog(@"%@", NSStringFromClass([super class]));
    }
    return self;
}
@end

這個(gè)答案是什么呢。開(kāi)始的時(shí)候嘀咕自沧,兒子坟奥,老子?但想想應(yīng)該不是這么簡(jiǎn)單拇厢,誠(chéng)然爱谁,確實(shí)沒(méi)有不是坑的題,先嘀咕著,不看答案孝偎。

這是關(guān)于消息的官方解釋

When it encounters a method invocation, the compiler might generate a call to any of several functions to perform the actual message dispatch, depending on the receiver, the return value, and the arguments. You can use these functions to dynamically invoke methods from your own plain C code, or to use argument forms not permitted by NSObject’s perform… methods. These functions are declared in /usr/include/objc/objc-runtime.h.

  1. objc_msgSend sends a message with a simple return value to an instance of a class.
  2. objc_msgSend_stret sends a message with a data-structure return value to an instance of a class.
  3. objc_msgSendSuper sends a message with a simple return value to the superclass of an instance of a class.
  4. objc_msgSendSuper_stret sends a message with a data-structure return value to the superclass of an instance of a class.

看不懂访敌,繼續(xù)往下,這里就要清楚Object-c里的消息機(jī)制衣盾。我們都知道消息機(jī)制的底層:

OBJC_EXPORT void objc_msgSend(void /* id self, SEL op, ... */ )
    __OSX_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
OBJC_EXPORT void objc_msgSendSuper(void /* struct objc_super *super, SEL op, ... */ )

這里就大概看得出寺旺,[self class]是調(diào)用的objc_msgSend,而[super class]調(diào)用的是objc_msgSendSuper势决。如果前面的很常見(jiàn)阻塑,哪后面的到底是個(gè)什么鬼大爺。

我們先看看objc_super

struct objc_super {
    id receiver;
   Class superClass;
};


receiver還是我們的兒子對(duì)象果复,而superClass就是你猜的他老漢陈莽。

但我們執(zhí)行[super class]。大概內(nèi)部執(zhí)行的邏輯是:

  1. 首先去老漢那去找這個(gè)方法据悔。是否存在传透,如果不存在就繼續(xù)讓上找。
  2. 在這里极颓,我們都沒(méi)有去實(shí)現(xiàn)這個(gè)class朱盐,所以找來(lái)找去在仙人那NSObject那找到了。

而我們的[self class]也是一樣的菠隆。從自己這開(kāi)始找兵琳,然后去老漢那狂秘,一直往上,直到仙人那躯肌,最后都在仙人那相遇了者春。但我們的receiver都是兒子。所以他們折騰來(lái)回清女,還是最終執(zhí)行的同一個(gè)方法钱烟,同一個(gè)接受者。所以結(jié)果自然也一樣嫡丙,打印出來(lái)都是Son拴袭。

為了驗(yàn)證這個(gè),請(qǐng)看下例

@interface GrandFather : NSObject
- (NSString *)name;
@end
@implementation GrandFather
- (NSString *)name {
    return [NSString stringWithFormat:@"grandfather:%@",NSStringFromClass([self class])];
}
@end

@interface Father : GrandFather

@end
@implementation Father
- (NSString *)name {
    return [NSString stringWithFormat:@"father:%@",NSStringFromClass([self class])];
}
@end

@interface Son : Father
@end
@implementation Son
- (NSString *)name {
    return [NSString stringWithFormat:@"son:%@",NSStringFromClass([self class])];
}

- (void)showName {
    NSLog([NSString stringWithFormat:@"%@,%@",[self name],[super name]]);
}
@end

如果我這樣調(diào)用

Son *son = [Son new];
[son showName];

這個(gè)看下結(jié)果就明了曙博。

總結(jié)下拥刻,第一個(gè)參數(shù)只是告訴引擎從那個(gè)層級(jí)上開(kāi)始找這個(gè)SEL,直到找到這個(gè)父泳。而我們隱藏的第一個(gè)參數(shù)才是真正的Receiver般哼。他才是真正的施法者。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末惠窄,一起剝皮案震驚了整個(gè)濱河市蒸眠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌睬捶,老刑警劉巖黔宛,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異擒贸,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)觉渴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門介劫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人案淋,你說(shuō)我怎么就攤上這事座韵。” “怎么了踢京?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵誉碴,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我瓣距,道長(zhǎng)黔帕,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任蹈丸,我火速辦了婚禮成黄,結(jié)果婚禮上呐芥,老公的妹妹穿的比我還像新娘。我一直安慰自己奋岁,他們只是感情好思瘟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著闻伶,像睡著了一般滨攻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蓝翰,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天铡买,我揣著相機(jī)與錄音,去河邊找鬼霎箍。 笑死甸箱,一個(gè)胖子當(dāng)著我的面吹牛颖系,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼辩诞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了些阅?” 一聲冷哼從身側(cè)響起檩咱,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎驯绎,沒(méi)想到半個(gè)月后完慧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡剩失,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年屈尼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拴孤。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡脾歧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出演熟,到底是詐尸還是另有隱情鞭执,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布芒粹,位于F島的核電站兄纺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏化漆。R本人自食惡果不足惜估脆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望获三。 院中可真熱鬧旁蔼,春花似錦锨苏、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至限佩,卻和暖如春葵诈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背祟同。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工作喘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晕城。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓泞坦,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親砖顷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贰锁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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

  • **2014真題Directions:Read the following text. Choose the be...
    又是夜半驚坐起閱讀 9,497評(píng)論 0 23
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,715評(píng)論 0 9
  • “行業(yè)分析是商業(yè)思考的基石滤蝠⊥阆ǎ”---可能是高爾基說(shuō)的。 公司制定戰(zhàn)略物咳、進(jìn)行咨詢項(xiàng)目锣险、做市場(chǎng)調(diào)研、創(chuàng)立公司或者投資人...
    飛行公路閱讀 652評(píng)論 0 14
  • 家庭會(huì)議一如既往無(wú)聊 從昨天10點(diǎn)多到今天凌晨 我假裝投入 我知道你們付出很多 但請(qǐng)?jiān)徫业淖运?我想要獨(dú)立的自我...
    角落蜷縮閱讀 189評(píng)論 0 0