OC中消息的概念
OC中在對(duì)象上調(diào)用方法仔雷,用OC的術(shù)語叫“傳遞消息”气破。在OC中,如果向某對(duì)象傳遞消息,會(huì)使用動(dòng)態(tài)綁定機(jī)制來決定需要調(diào)用的方法借帘。在底層飞涂,都是普通的C語言函數(shù)衷旅,對(duì)象收到消息后铺根,到底該調(diào)用哪個(gè)方法,完全由運(yùn)行期決定罐旗,甚至可以在運(yùn)行時(shí)改變膳汪,這種特性使得OC成為真正的動(dòng)態(tài)語言。
發(fā)送消息可以用下面的代碼來表示:
id returnValue = [someObject messageName:parameter];
這條語句表示向someObject發(fā)送了一個(gè)消息九秀。someObject我們成為“消息接收者”(recevier)遗嗽,message我們稱為“選擇子”(selector)。選擇子和參數(shù)合起來我們稱之為消息(message)
objc_msgSend的作用
編譯器會(huì)將上述語句轉(zhuǎn)換為一個(gè)標(biāo)準(zhǔn)的C語言函數(shù)調(diào)用鼓蜒,如下:
id objc_msgSend(id self, SEL cmd, ...);
這是一個(gè)參數(shù)可變的函數(shù)媳谁,第一個(gè)參數(shù)代表接收者,第二個(gè)參數(shù)代表選擇子友酱,后面的參數(shù)就是消息中的參數(shù),順序不變柔纵。
objc_msgSend函數(shù)會(huì)依據(jù)接收者與選擇子的類型來調(diào)用適當(dāng)?shù)姆椒ǖ奚肌T摲椒ㄐ柙诮邮照咚鶎俚念愔兴褜ぁ胺椒斜怼保绻苷业脚c選擇子名稱相符的方法搁料,就跳轉(zhuǎn)至實(shí)現(xiàn)代碼或详。如果找不到,則沿著繼承體系向上找郭计。如果還是找不到霸琴,則執(zhí)行性“消息轉(zhuǎn)發(fā)”。
還有一些屬于其他“邊界情況”的消息調(diào)用過程昭伸,由另一些函數(shù)來處理
- objc_msgSend_fpret: 返回浮點(diǎn)數(shù)
- objc_msgSend_stret: 返回值為結(jié)構(gòu)體
- objc_msgSendSuper:向父類發(fā)消息梧乘,例如:[super message:parameter],那么就交由此函數(shù)來處理。也有另外兩個(gè)與objc_msgSend_stret和objc_msgSend_fpret等效的函數(shù),用于處理發(fā)給super的相應(yīng)消息选调。