数据结构
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
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
网友评论