IOS categoty,成员变量,属性实现的总结
2016-06-21 10:22
260 查看
我们首先看看关于类别的结构体:
![](http://img.blog.csdn.net/20160621102303559?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
从上面结构体中我们可以看到这几个属性:
category_name:类别的名字。
class_name:类别的类。
instance_methods:类别中的实例方法(-)。
class_methods:类别中的类方法(+)。
protocols:类别中的协议。
那么类别怎么往原始类中添加方法呢?
1.首先他将类别中的类方法添加到class的mehod class中。
2.然后将类别中的实例方法以倒序的方式添加到类别中的实例方法中,如果原本类中有方法a,b,新家的类别中有方法c,d。那么方法列表中保存方法的顺序为c,d,a,b。
3.当类别添加完毕后,回销毁原始的类别。
我们再来看看成员变量和属性的结构体。
先看成员变量:
![](http://img.blog.csdn.net/20160621104748695?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
上述结构体前面两个参数就不用说了,我们主要看看第3个参数:ivar_offset,他是说明这个成员变量和基地址的偏移。当我们编译我们的类的时候,编译器会给我门类的属性生成一个布局。
![](http://img.blog.csdn.net/20160621105216507?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
当我们往某个类父类中添加属性时,编译器会更改我们上述的布局。这时子类的布局就会出错。
![](http://img.blog.csdn.net/20160621105403244?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
这时应该怎么办呢?
其实偏移地址是通过基类地址+对象地址+ivar偏移地址来算出实际的地址。
那么属性是怎么回事,属性其实就是将属性转化为上述的成员变量,然后编译器自动合成setter和getter方法。
从上面结构体中我们可以看到这几个属性:
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方法。
相关文章推荐
- iOS之加载HTML中的特殊字符
- iOS 开发 百度地图
- iOS备忘录之常用的第三方开源库
- IOS的后台任务
- iOS 支持 IPv6
- iOS-socket
- iOS中,如何在github上上传自己的项目
- iOS中集成ijkplayer视频直播框架
- iOS 时间与日期处理
- iOS中气泡对话框拉伸效果视图的实现
- iOS 判断是否是数字
- iOS 判断是否连接wifi
- iOS 判断身份证号码
- iOS 根据生日(单位秒)转换成一个年龄
- iOS pch中或者common.h中常见的代码
- MVC's Blind Structure Way
- iOS利用AFNetworking(AFN) 实现图片上传
- iOS支付宝支付
- iOS用户是否开启定位服务
- ios Symbol(s) not found for architecture arm64总结 含隐藏错误cocoapods