iOS 消息發送之 objc_msgSend

做iOS開發童靴們都知道OC 是一門動態語言,所有的方法都是 
通過runtime發送消息,大家對這個都了解,那么runtime是如何 
發送消息了,調用了那個函數了?如何調用了?看到這可能有 
點懵逼了,這篇文章簡單的介紹了下  runtime 之 
objc_msgSend 函數的使用,也是我第一次在簡書上寫文章, 
錯誤之處還望大家包涵,希望能一起共同進步。

objc_msgSend 官方文檔解釋

  objc_msgSend 官方文檔解釋: When it encounters a 
  method call, the compiler generates a  call to one of the 
  functions objc_msgSend, objc_msgSend_stret, 
  objc_msgSendSuper, or objc_msgSendSuper_stret. 
  Messages sent to an object’s superclass (using the super 
  keyword) are sent using objc_msgSendSuper; other 
  messages are sent using objc_msgSend. Methods that have 
  data structures as return values are sent using 
  objc_msgSendSuper_stret and objc_msgSend_stret.

這句話的大致意思是發送一條消息,該消息帶有一個簡單的返回值類的一個實例。當遇到一個方法調用時,編譯器生成一個調用函數objc_msgSend之一,objc_msgSend_stret,objc_msgSendSuper或objc_msgSendSuper_stret。消息發送到一個對象的超類(使用超級關鍵字)使用objc_msgSendSuper發送;其他使用objc_msgSend消息被發送。數據結構作為返回值的方法使用objc_msgSendSuper_stret和objc_msgSend_stret發送
最關鍵一點:無論何時,要調用objc-msgSend 函數,必須要將函數轉化成合適的函數指針才能調用,
說了這么多,那么我們如何去使用這個函數了,一般在什么情況下去使用了,開始的時候我看這些東西,只是為了了解OC 的一些底層實現,現在在我們的項目中使用過這個函數,所以想著把這個東西寫出來,加深自己的理解,OC 的方法是如何轉化成 objc-msgSend來發送消息了。

1. 創建并初始化對象

比如我們一直以來使用類似這樣的代碼 NSObject * p = [[NSObject alloc] init];來創建對象,其實在運行時這一行代碼會轉換成類似如下的代碼:
屏幕快照 2017-08-14 下午2.45.54.png

2.發送無參數無返回值消息

第一個方法是使用objc_msgSend發送消息,第二個方法的實現objc_msgSend的里的方法
屏幕快照 2017-08-14 下午5.25.11.png

3.發送有參數無返回值
屏幕快照 2017-08-14 下午5.33.45.png

4發送無參數有返回值的
屏幕快照 2017-08-14 下午5.43.52.png

5發送有參數有返回值
屏幕快照 2017-08-14 下午5.46.19.png

6 除了以上幾種方法,我們還可以使用block和objc_msgSend 一起使用,來回調所需要的參數,可以寫一個總的方法來分發函數的調用。
屏幕快照 2017-08-14 下午6.27.00.png

第一個參數是所要分發函數名稱(也是方法名),第二個參數是函數所需要的參數(入參),第三個是使用block來回調所需要的參數。
注意如何返回的值是帶浮點,或者是帶結構體返回值需要使用objc_msgSend_fpret和objc_msgSend_stret方法,
demo地址 https://github.com/yangxinliang/ForWord.git
這是我第一次寫簡書,寫的不好的地方還請見諒,大神請繞開,主要目的希望大家一起共同進步。(后續還會對demo進行優化)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容