您的位置:首页 > 移动开发 > IOS开发

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

2016-06-21 10:22 260 查看
我们首先看看关于类别的结构体:



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

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方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: