理解OC中的消息機制

OC中在對象上調用方法其實就是給該對象發(fā)送一個消息,比如

Student *student = [Student new];
[student getName:name ];

例子中,可以理解為給student對象發(fā)送一個消息,其中student是接受者,getName是選擇子,選擇子和參數合起來就是消息。
??編譯器編譯的時候會把例子中的代碼轉換成標準的C語言函數調用,即objc_msgSend,如下:

objc_msgSend(student,@selector(getName:),name);

而obje_msgSend的原型是

void obje_msgSend(id self,SEL cmd,...)

這是一個參數個數可變的函數,能接受多個參數,第一個參數是接受者,第二個參數是選擇子,后續(xù)參數是消息中的參數。obje_msgSend函數會依據接受者與選擇子的類型來調用適當的方法,為了完成此操作,該方法需要在Student中遍歷其方法列表,如果能找到與選擇子相匹配的方法,就調至該方法的實現代碼。如果找不到,那就沿著集成體系繼續(xù)向上查找。如果最終還是找不到相匹配的方法,那就執(zhí)行 message forwarding (消息轉發(fā))操作。
??其實在遍歷Student中的方法列表之前,這個操作還會去遍歷Student的 fast map,這是每個類都會有的一塊緩存區(qū)域,該緩存中存放著obje_msgSend函數的匹配結果。這樣做的目的是為了提高消息傳遞的效率。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容