• 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 对象,也没有找到你调用的方法,就会报告不能识别发送消息的错误。

  • 相关阅读:
    母函数做的题
    HDU2089 暴力打表
    HDU2036 改革春风吹满地
    HDU1201 水题
    高可用服务 AHAS 在消息队列 MQ 削峰填谷场景下的应用
    Nacos Committers 团队首亮相,发布 0.9.0 版本
    Dubbo Mesh 在闲鱼生产环境中的落地实践
    Watchdogs利用Redis实施大规模挖矿,常见数据库蠕虫如何破?
    阿里在使用一种更灵活的软件集成发布模式
    2019 年,容器技术生态会发生些什么?
  • 原文地址:https://www.cnblogs.com/xin-lang/p/6124556.html
Copyright © 2020-2023  润新知