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进行优化)

你可能感兴趣的:(iOS 消息发送之 objc_msgSend)