美文网首页收藏ios
iOS 消息发送之 objc_msgSend

iOS 消息发送之 objc_msgSend

作者: 辣枭子 | 来源:发表于2017-08-14 18:09 被阅读914次
    做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

        本文链接:https://www.haomeiwen.com/subject/eclurxtx.html