开发者社区> 问答> 正文

9、IMP、SEL、Method的区别和使用场景

9、IMP、SEL、Method的区别和使用场景

展开
收起
游客bnlxddh3fwntw 2020-04-13 15:14:44 2596 0
2 条回答
写回答
取消 提交回答
  • 有点尴尬唉 你要寻找的东西已经被吃掉啦!

    SEL : 方法选择器,SEL是函数objc_msgSend第二个参数的数据类型,表示方法选择器 ,在ios开发中SEL就是可以根据一个SEL选择对应的方法IMP,更偏向于c里的函数声明 Method : 就是一个指向objc_method结构体指针,它存储了方法名(method_name)、方法类型(method_types)和一个指向方法实现的函数指针(method_imp)等信息 IMP : 本质上就是一个函数指针,指向方法的实现的地址,当你向某个对象发送一条信息,可以由这个函数指针来指定方法的实现,它最终就会执行那段代码,这样可以绕开消息传递阶段而去执行另一个方法实现。

    2020-04-13 19:20:25
    赞同 展开评论 打赏
  • IMP:是方法的实现,即:一段c函数

    SEL:是方法名

    Method:是objc_method类型指针,它是一个结构体,如下:

    struct objc_method {
        SEL _Nonnull method_name                                 OBJC2_UNAVAILABLE;
        char * _Nullable method_types                            OBJC2_UNAVAILABLE;
        IMP _Nonnull method_imp                                  OBJC2_UNAVAILABLE;
    }
    

    使用场景:

    实现类的swizzle的时候会用到,通过class_getInstanceMethod(class, SEL)来获取类的方法Method,其中用到了SEL作为方法名

    调用method_exchangeImplementations(Method1, Method2)进行方法交换

    我们还可以给类动态添加方法,此时我们需要调用class_addMethod(Class, SEL, IMP, types),该方法需要我们传递一个方法的实现函数IMP,例如:

    static void funcName(id receiver, SEL cmd, 方法参数...) {
       // 方法具体的实现   
    }
    

    函数第一个参数:方法接收者,第二个参数:调用的方法名SEL,方法对应的参数,这个顺序是固定的。

    2020-04-13 15:16:17
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载