IOS categoty,成员变量,属性实现的总结

来源:互联网 发布:淘宝在哪里查消费总额 编辑:程序博客网 时间:2024/05/04 17:50

我们首先看看关于类别的结构体:


从上面结构体中我们可以看到这几个属性:

category_name:类别的名字。

class_name:类别的类。

instance_methods:类别中的实例方法(-)。

class_methods:类别中的类方法(+)。

protocols:类别中的协议。

那么类别怎么往原始类中添加方法呢?

1.首先他将类别中的类方法添加到class的mehod class中。

2.然后将类别中的实例方法以倒序的方式添加到类别中的实例方法中,如果原本类中有方法a,b,新家的类别中有方法c,d。那么方法列表中保存方法的顺序为c,d,a,b。

3.当类别添加完毕后,回销毁原始的类别。

我们再来看看成员变量和属性的结构体。

先看成员变量:


上述结构体前面两个参数就不用说了,我们主要看看第3个参数:ivar_offset,他是说明这个成员变量和基地址的偏移。当我们编译我们的类的时候,编译器会给我门类的属性生成一个布局。

Objective-C总Runtime的那点事儿


当我们往某个类父类中添加属性时,编译器会更改我们上述的布局。这时子类的布局就会出错。

这时应该怎么办呢?

其实偏移地址是通过基类地址+对象地址+ivar偏移地址来算出实际的地址。

那么属性是怎么回事,属性其实就是将属性转化为上述的成员变量,然后编译器自动合成setter和getter方法。


0 0