[iOS底层]-SEL和IMP
[iOS底层]-SEL和IMP
SEL和IMP是什么?
- **SEL:**方法编号,就像是一本书的目录,SEL是每章的标题。
- **IMP:**函数指针地址,IMP就像是页码,通过SEL和对应IMP,我们就能找到函数的实现代码存放位置。
编译底层
下载工程文件,使用Clang
把main.m
编译成C++文件,编译方法可以查看使用Clang编译器把OC文件编译成C++文件。
打开main.cpp
文件,在1122645
行代码处发现set
和get
方法在C++中被解析成如下代码:
可以看到_method_list_t
是一个结构体,并且进行了初始化,_object_method
是存储方法的结构体,它的定义如下:
struct _objc_method { |
具体看下nickName
方法的存储
{(struct objc_selector *)"nickName", "@16@0:8", (void *)_I_LGPerson_nickName} |
nickName
就是SEL
。(void *)_I_LGPerson_nickName
是函数指针IMP
。@16@0:8
是method_type
。具体含义如下:- 第一个
@
:表示返回值 16
: 参数共用字节 16- 第二个
@
:第一个参数 0
: 从第0位开始:8
: 表示sel,从第8位开始
- 第一个
具体编码代表的意义可以看下图,或者查看官方的Type Encodings文档。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 雷军的博客!