Objective-C中的消息轉發(fā)

主要是學習Objective-C的“多繼承”——消息轉發(fā)博客怖喻。

具體的代碼是 : OC2Nature項目中 SendMSG 目錄如孝, 歡迎下載查看,謝謝颜凯!

Objective-C 不支持多繼承谋币,但是也能做到多繼承的效果,具體方式有:消息轉發(fā)症概、delegate與protocol蕾额、類別

Objective-C消息轉發(fā) 是什么關系呢彼城?還有一個專業(yè)名詞叫消息機制诅蝶。 在 Objective-C 中的 消息機制 發(fā)生在運行時,與編譯時沒有任何關系募壕。

Objective-C是一門動態(tài)語言调炬,一個函數(shù)是由一個selector(SEL),和一個implement(IML)組成的舱馅。Selector相當于門牌號缰泡,而Implement才是真正的住戶(函數(shù)實現(xiàn))。和現(xiàn)實生活一樣代嗤,門牌可以隨便發(fā)(@selector(XXX))棘钞,但是不一定都找得到住戶,如果找不到系統(tǒng)會給程序幾次機會來程序正常運行干毅,實在沒出路了才會拋出異常宜猜。

引用中提到的門牌可以隨便發(fā),是這個意思:

[receiver performSelector:@selector(message)];

在上面的message在代碼中可以順便寫,在編譯階段不會報錯硝逢,只會有警告而已姨拥,所以才說門牌可以隨便發(fā)。其中 performSelector: 是系統(tǒng)發(fā)送消息的方法, message 就是所謂的門牌號渠鸽。上面的語句可以理解成 拿著 message 這個門牌號到receiver對象中去尋找implement(IML)(具體實現(xiàn))叫乌,如果找到了就執(zhí)行,如果沒有找到就奔潰徽缚。

還有一種說法:每發(fā)送一個消息(message)综芥,知道程序運行的時候才會去尋找具體的實現(xiàn)(IML),在Objective-C中國年發(fā)送一條消息的經(jīng)典表達式如下:

[receiver message];

最終在運行時轉成了這樣的格式:

objc_msgSend(receiver, @selector(message))

其中 objc_msgSend 可以有參數(shù),如:

objc_msgSend(receiver, @selector(message), arg1,arg2)

是怎么通過門牌號去尋找具體的IML的呢猎拨?Objective-C的“多繼承”——消息轉發(fā)是使用下圖解釋的:




動態(tài)消息解析

快速消息轉發(fā)

主要是重寫如下系統(tǒng)方法:

- (id)forwardingTargetForSelector:(SEL)aSelector

按照我的理解應該是這樣的:當前對象收到一個aSelector的時候膀藐, 先檢查一下自己能否執(zhí)行, 若是不能執(zhí)行的話红省,就在這里交給別人執(zhí)行吧额各。這個方法執(zhí)行是有條件的,在動態(tài)方法沒有找到的情況下才會被執(zhí)行吧恃。

// Teacher 類需要實現(xiàn)將消息轉發(fā)給 Doctor
- (id)forwardingTargetForSelector:(SEL)aSelector {
    // 醫(yī)生
    Doctor *doctor = [[Doctor alloc]init];
    if ([doctor respondsToSelector:aSelector]) {
        return doctor;
    }
    
    // 返回 nil 說明快速消息轉發(fā)失敗
    return nil;
}

標準消息轉發(fā)

快速消息轉發(fā)返回 nil 的時候虾啦,會到標準消息轉發(fā)。主要是重寫以下兩個系統(tǒng)方法:

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
- (void)forwardInvocation:(NSInvocation *)anInvocation
兩種消息轉發(fā)比較

以下是參考截圖

一個小 Demo

以上均是參考各位大神的博客的抄襲總結痕寓,由于這些方法通常也用不到傲醉,過一段時間來看的話感覺又模糊了,故特弄了一個 Demo呻率,以便后期方便查看硬毕。具體的代碼是 : OC2Nature項目中 SendMSG 目錄, 歡迎下載查看礼仗,謝謝吐咳!

參考

0、Objective-C的“多繼承”——消息轉發(fā)
1元践、蘋果
2韭脊、繼承自NSObject的不常用又很有用的函數(shù)(2)
3、消息機制

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末单旁,一起剝皮案震驚了整個濱河市沪羔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌象浑,老刑警劉巖蔫饰,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異融柬,居然都是意外死亡死嗦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門粒氧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來越除,“玉大人,你說我怎么就攤上這事外盯≌瑁” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵饱苟,是天一觀的道長孩擂。 經(jīng)常有香客問我,道長箱熬,這世上最難降的妖魔是什么类垦? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任狈邑,我火速辦了婚禮,結果婚禮上蚤认,老公的妹妹穿的比我還像新娘米苹。我一直安慰自己,他們只是感情好砰琢,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布蘸嘶。 她就那樣靜靜地躺著,像睡著了一般陪汽。 火紅的嫁衣襯著肌膚如雪训唱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天挚冤,我揣著相機與錄音况增,去河邊找鬼。 笑死你辣,一個胖子當著我的面吹牛巡通,可吹牛的內容都是我干的。 我是一名探鬼主播舍哄,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼宴凉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了表悬?” 一聲冷哼從身側響起弥锄,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蟆沫,沒想到半個月后籽暇,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡饭庞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年戒悠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舟山。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡绸狐,死狀恐怖,靈堂內的尸體忽然破棺而出累盗,到底是詐尸還是另有隱情寒矿,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布若债,位于F島的核電站符相,受9級特大地震影響,放射性物質發(fā)生泄漏蠢琳。R本人自食惡果不足惜啊终,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一镜豹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蓝牲,春花似錦逛艰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽菇绵。三九已至肄渗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間咬最,已是汗流浹背翎嫡。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留永乌,地道東北人惑申。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像翅雏,于是被迫代替她去往敵國和親圈驼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內容