编写代码--------编译连接---------运行
(1)OC的动态性都是靠runtime的API支撑的。
(2)isa指针isa详解
实例对象的isa指针指向类对象,类对象的isa指针指向元类对象,元类对象的isa指针指向根类元类(如何指向请查看)
如图
(3)类结构(方法如何存放在类结构中)
(4)method_t
types对应表
例如:- (int) test: (int)age height: (float)height;
@“i24 @0 : 8 i16 f 20”
i表示返回值int的i;20代表所有参数的所占内存( id 8 sel8 int4 height4)
@第一个参数self;0从第零个字节开始
:sel方法名,从第八个字节开始,因为前面有占8位的self
(每个方法默认第一个参数是self,第二个是sel)
iage,int类型,从16开始
f20同上
(5)方法缓存
cache_t;
顾名思义,第一次调用某个方法从method_list中找,找到了调用,然后放入cache_t;下次又调用该方法直接从cache_t查找
如果调用父类的方法,去自己缓存找,找不到;去自己方法列表,找不到;去父类缓存,找不到,去父类方法列表,找到后调用,然后缓存到自己的类的缓存中。
如何将方法缓存到cache_t; key&_mask得到索引,存储到索引位置,前面的内存浪费掉
在cache _t中如何查询
key & _mask = 在散列表_buckets中的索引,直接取出
当两个不同的key&_mask 得到的索引相同时,后者-1,直到减到0,将i变为mask重来;