[iOS底层]-SEL和IMP

2020/9/17 总阅读量

SEL和IMP是什么?

  • SEL:方法编号,就像是一本书的目录,SEL是每章的标题。
  • IMP:函数指针地址,IMP就像是页码,通过SEL和对应IMP,我们就能找到函数的实现代码存放位置。

编译底层

下载工程文件,使用Clangmain.m编译成C++文件,编译方法可以查看使用Clang编译器把OC文件编译成C++文件
打开main.cpp文件,在1122645行代码处发现setget方法在C++中被解析成如下代码:

可以看到_method_list_t是一个结构体,并且进行了初始化,_object_method是存储方法的结构体,它的定义如下:

struct _objc_method {
    struct objc_selector * _cmd; // typedef struct objc_selector *SEL;
    const char *method_type;
    void  *_imp;
};

具体看下nickName方法的存储

{(struct objc_selector *)"nickName", "@16@0:8", (void *)_I_LGPerson_nickName}
  • nickName就是SEL
  • (void *)_I_LGPerson_nickName是函数指针IMP
  • @16@0:8method_type。具体含义如下:
    • 第一个@:表示返回值
    • 16: 参数共用字节 16
    • 第二个@:第一个参数
    • 0: 从第0位开始
    • :8: 表示sel,从第8位开始

具体编码代表的意义可以看下图,或者查看官方的Type Encodings文档。