iOS runtime(一)数据结构和元类
2018-03-09 本文已影响0人
Nomo_C
数据结构
![](https://img.haomeiwen.com/i11013314/9536bc9a2be1e88c.png)
Class:结构体objc_class的指针
id:结构体objc_object的指针。objc_object中的isa指向元类
SEL:它是映射到方法的字符串,可以使用Objctive-C的编译器命令@selector或者Runtime的sel_registerName函数获得一个SEL类型的方法选择器。需要注意的是只要方法名相同,SEL就相同,所以下面这种情况编译器会报错:
- (int)helloworld:(int)flag;
- (float)helloworld:(float)flag;
IMP:函数指针
objc_class
![](https://img.haomeiwen.com/i11013314/992b5cf05b307bf1.png)
isa:指向元类
super_class:当前类的父类
name:类名
version:版本信息
info:提供运行期使用的标示符
instance_size:当前类实例对象大小(包含父类)
ivars:成员变量列表
methodLists:指向该类实例方法列表,将方法选择器和方法实现地址联系起来。methodLists是指向objc_method_list指针的指针,也就是说可以动态修改*methodLists的值来添加成员方法,这也是category的实现原理,同样解释了category不能添加变量的原因。
cache:Runtime 系统会把调用的方法存储到cache,下次查找的时候效率更高。
protocols:指向该类的协议列表
类与元类
isa表示:实例对象的类是类对象,类对象的类是元类对象,元类对象的类是根元类(isa指向自己)。
类对象的父类最终都继承自根类对象NSObject,NSObject的父类是nil
元类对象(包括根元类)的父类最终继承自根类对象NSObject
![](https://img.haomeiwen.com/i11013314/91bb5abda1e3dc63.png)