Class:
class其实是一个结构体,所有类的模板都是这个,isa指针指向的是元类(后面会讲到),super_class指针指向的是父类,version为版本,info为类的信息,instance_size为类的大小,ivars指向的是成员变量列表的首地址,methodList指向的是所有方法的首地址,cache为缓存上一次调用方法,protocols指向所有协议的地址
class结构体Ivar:成员变量的结构体
ivar结构体Ivar是个什么东西,下面给大家展示Ivar到底是个什么东西,我这里创建了一个模型(不要纠结我创建的怪怪的),用于给大家理解
演示类然后我们把Ivar结构体的信息打印出来,我这里定义了C串转OC的宏
#define exChangeString(CString) [NSString stringWithCString:(CString) encoding:NSUTF8StringEncoding]
打印Ivar的内容结果:
Ivar结果ivar_name:成员变量名的CString
ivar_offset:成员变量与首地址的偏移字节数(从偏移量不能看出Ivar列表是数组格式还是链表格式)
ivar_type:成员变量类型编码(后面会讲到)
Method:我们再来看Method是个什么鬼,SEL方法名,method_types方法的编码格式,IMP方法的实现
method结构 打印方法 打印结果Method结果:把@property创建的getter,setter方法都打印出来了,以及对象方法,大家有没有发现returnOneArr这个类方法怎么没有打印出来(卖个关子,后面会讲)
Property:上面说了Ivar(变量名,变量类型,偏移量),Method(SEL方法选择器,IMP实现,返回类型,参数),然而我们平常用的@property有很多修饰nonatomic,copy等等,其实就这个东西objc_property_t,这个结构体我没找到库结构,但是我猜想是只有这两个东西,一个是属性名,一个是属性描述,可以通过属性方法看到
那属性里面含有的是什么,我们还是把它打印一下
打印属性 打印出的东西objc_property_t打印出来的是属性名,和属性描述,而属性描述又是以键值对的方式,但是大家发现没有,成员变量age,ageNum没有打印出来,所以说Ivar和property的区别是:
1.Ivar:成员变量会保存在Ivar中,@property生成的成员变量也会保存在Ivar中,Ivar的结构就是(成员变量名,偏移量,类型编码)
2.property:属性保存在objc_property_t中,包括属性描述copy,Strong,属性名,它不会涵盖{变量类型 变量}这种格式生成的成员变量,objc_property_t的结构就是(属性名,描述信息)
3.Method:结构就是(SEL包裹的方法名,IMP包裹的方法实现,types包裹着返回类型,参数个数,参数类型信息)
下面是类型编码的贴图NSString,Int等
xx 成员变量类型编码关于属性描述Strong,Copy等的贴图
属性描述编码元类:
之前我说过isa指向的是元类,什么是元类,简单概括就是类的类,上面有一个的疑问就是对象方法保存在类模板中,那类方法放哪去了,其实类方法就放在元类中,isa指针类型是Class,可以说元类其实和类一模一样的构型,可是它的区别就是它保存这类方法,类模板相对于元类其实可以看做是对象,我们平常调用类方法都是用类名去调用,其实就是元类的对象(也就是类)调用方法而已
打印元类的对象方法 打印结果结果显示元类里面存着类方法的名称实现等相关信息
总结:结构如下图
class结构其他:关于runtime一些相关的方法,有不全的,你们可以自己去看文档
Objc:
class:太多了 自己看文档,话少人懒
Ivar:
Method:
Property:
如果有不严谨或者错误的地方,请指正.
网友评论