網(wǎng)上的知識很多系羞,但是知識只有自己過一遍才有意義吞加。
關(guān)于消息發(fā)送和消息轉(zhuǎn)發(fā)穴店,Objective-C 消息發(fā)送與轉(zhuǎn)發(fā)機制原理講的很詳細燥翅。
同時還有這幾篇神經(jīng)病院 Objective-C Runtime 入院第一天—— isa 和 Class,神經(jīng)病院 Objective-C Runtime 住院第二天——消息發(fā)送與轉(zhuǎn)發(fā)鸟蟹,
神經(jīng)病院 Objective-C Runtime 出院第三天——如何正確使用 Runtime乌妙,
Runtime又叫運行時,是一套底層的C語言API建钥,是iOS系統(tǒng)的核心之一藤韵。開發(fā)者在編碼過程中,可以給任意一個對象發(fā)送消息熊经,在編譯階段只是確定了要向接受者發(fā)送這條消息荠察,而接受者將要如何響應(yīng)和處理這條消息,那就要看運行時來決定了奈搜。
SEL類成員方法的指針,但不同于C語言中的函數(shù)指針盯荤,函數(shù)指針直接保存了方法的地址馋吗,但SEL只是方法編號
IMP一個函數(shù)指針,保存了方法的地址秋秤。
IMP和SEL關(guān)系:
每一個繼承于NSObject的類都能自動獲得runtime的支持宏粤。在這樣的一個類中,有一個isa指針灼卢,指向該類定義的數(shù)據(jù)結(jié)構(gòu)體绍哎,這個結(jié)構(gòu)體是由編譯器編譯時為類(需繼承于NSObject)創(chuàng)建的,在這個結(jié)構(gòu)體中有包括了指向其父類類定義的指針以及SEL和IMP的對應(yīng)表鞋真。
消息發(fā)送是runtime通過selector快速查找IMP的過程崇堰,有了函數(shù)指針就可以執(zhí)行對應(yīng)的方法實現(xiàn),消息轉(zhuǎn)發(fā)是在查找IMP失敗后執(zhí)行一系列轉(zhuǎn)發(fā)流程的慢速通道涩咖,如果不做轉(zhuǎn)發(fā)處理海诲,則會拋出異常。
在Effective Objective-C 2.0上有一張圖很好的解釋了消息轉(zhuǎn)發(fā)