zoukankan      html  css  js  c++  java
  • Objective-C运行时态消息传递--拼接方法名

    做IOS开发的人都知道,Objective-C语言中方法的调用是运行时采取绑定的,在编译过程中只声明该方法的存在。

    那么我们来简单说下在运行时,类的消息传递。

    在运行时,每个方法如[self methodName]向系统发送一个消息被编译器转换成: objc_msgSend( id receiver, SEL selector ,参数…)  的 C 函数调用。

     在我们写代码的时候,是不需要直接使用这种写法的,此过程是编译器帮助我们转换的。但是,不需要不代表不可以,在程序运行时,我们也可以直接使用此类方法。在不定方法名或拼装方法名的时候就经常用到,如:

       SEL select = NSSelectorFromString([NSString stringWithFormat:@"parse%d:type:", p->m_wDataType]);
            if ([self respondsToSelector:select]) {
                DDLogVerbose(@"DataEngine call %@", NSStringFromSelector(select));
                ((void (*)(id, SEL, const UInt8*,EMSocketType))objc_msgSend)(self, select, data,type);
            } else {
                DDLogWarn(@"DataEngine call unkonw fun type = %d", p->m_wDataType);
            }

    在 objc_msgSend 动态绑定过程是这样的

     A.首先通过第一个参数的 receiver,找到它的isa 指针,然后在 isa 指向的 Class 对象中使用第二个参数selector 查找方法;
     B.如果没有找到,就使用当前Class 对象中的新的isa 指针到上一级的父类的Class 对象中查找;
     C.当找到方法后,再依据receiver 的中的self 指针找到当前的对象,调用当前对象的具体实现的方法(IMP 指针函数),然后传递参数,调用实现方法。
     D.假如一直找到NSObject 的Class 对象,也没有找到你调用的方法,就会报告不能识别发送消息的错误。

  • 相关阅读:
    弹窗多内容,灵活布局计算方式总结
    暖场广告设计方案
    UIStackView上手教程
    多弹窗排序总结
    常用的code snipper
    iOS开发常用技能点(持续更新中。。。)
    32位和64位系统区别及int字节数
    liunx环境,摄像头无法识别,解决方案
    TCP/IP 笔记 7 Ping
    TCP/IP 笔记 6 netstat -s 命令查看每个协议统计数据
  • 原文地址:https://www.cnblogs.com/xin-lang/p/6124556.html
Copyright © 2011-2022 走看看