【引】objective-c,4:category的原理
objc_category主要参考博文:
http://blog.leichunfeng.com/blog/2015/05/18/objective-c-category-implementation-principle/
一般说来,给一个类或者对象动态增加方法的方式有2种,1,继承。2,关联。
category可以理解成是上面“关联”的一种具体实现。在不改变原有类的前提下,动态地给这个类添加一些方法。
实现原理:
category在oc1中的定义是,
typedef struct objc_category *Category;
是指向一个objc_category
的结构体。在oc2中指向一个category_t的结构体,
这个category_t的定义是,
其中,
1,name是class_name,cls是要扩展的类,在runtime阶段根据name动态获取。
2,同时包含要添加的instancemethods,classMethods,protocols。
3,instanceProperties表示Category里所有的properties,这就是我们可以通过objc_setAssociatedObject和objc_getAssociatedObject增加实例变量的原因,不过这个和一般的实例变量是不一样的。普通的实例变量是在实例的内存结构里的。
Q:category中声明的properties,是没有自动生成@ synthesize的。因此,也就没有set get 以及 _property,因此无法在set和get中对properties处理。因此一般是用AssociatedObject的方式。
runtime在被加载的时候,会load所有的类,category和protocol。其中,category在被加载时,
1,首先load category。
2,对category处理:实例方法被加入到了当前的类对象中, 类方法被加入到了当前类的Meta Class中。
也就是把一个category的category_method_list的所有方法取出来,在类中生成新了method list。也就是重建类和元类的方法列表。
将类中的旧有方法和 Category 中新添加的方法整合成一个新的方法列表,生成后,主类中的方法和 Category 中的方法在 runtime 看来并没有区别,它们是被同等对待的,都保存在类或者元类的方法列表中。
【引】objective-c,4:category的原理的更多相关文章
- 结合 category 工作原理分析 OC2.0 中的 runtime
绝大多数 iOS 开发者在学习 runtime 时都阅读过 runtime.h 文件中的这段代码: struct objc_class { Class isa OBJC_ISA_AVAILABILI ...
- iOS Category实现原理 (补充)
iOS Category实现原理 (补充) load 和 initialize load load方法会在程序启动就会调用,当装载类信息的时候就会调用. 调用顺序看一下源代码.在 objc-loadm ...
- iOS Category实现原理
iOS Category实现原理 实现原理 我们不主动引入 Category 的头文件,Category 中的方法都会被添加进主类中.我们可以通过 - performSelector: 等方式 对 C ...
- Objective C ARC 使用及原理
手把手教你ARC ,里面介绍了ARC的一些特性, 还有将非ARC工程转换成ARC工程的方法 ARC 苹果官方文档 下面用我自己的话介绍一下ARC,并将看文档过程中的疑问和答案写下来.下面有些是翻译,但 ...
- Category 特性在 iOS 组件化中的应用与管控
背景 iOS Category功能简介 Category 是 Objective-C 2.0之后添加的语言特性. Category 就是对装饰模式的一种具体实现.它的主要作用是在不改变原有类的前提下, ...
- extension(类扩展)和 category(类别)
extension(类扩展) 简单来说,extension在.m文件中添加,所以其权限为private,所以只能拿到源码的类添加extension.另外extension是编译时决议,和interfa ...
- BeanUtils基本使用方法与原理
使用BeanUtils的原因 因为setProperty是JSP中的标签,因此使用model 2模式JSP+Servlet+JavaBean的时候,JSP将form提交给Servlet程序,而Serv ...
- OC小结
#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * a ...
- iOS开发——高级篇——Objective-C特性:Runtime
Objective-C是基于C语言加入了面向对象特性和消息转发机制的动态语言,这意味着它不仅需要一个编译器,还需要Runtime系统来动态创建类和对象,进行消息发送和转发.下面通过分析Apple开源的 ...
随机推荐
- win10 Unistack 服务组 占用资源如何解决
开始菜单>设置>隐私,隐私界面的左侧栏目,找最后一个“后台应用”,把后台运行的应用全部关掉即可
- java基础之 GC
Java程序员在编码过程中通常不需要考虑内存问题,JVM经过高度优化的GC机制大部分情况下都能够很好地处理堆(Heap)的清理问题.以至于许多Java程序员认为,我只需要关心何时创建对象,而回收对象, ...
- Scala的下一步
第七步:带类型的参数化数组 Scala里可以使用new实例化对象或类实例.当你在Scala里实例化对象,可以使用值和类型把它参数化:parameterize.参数化的意思是在你创建实例的时候“设置”它 ...
- JavaScript数据类型
当说到JavaScript的数据类型时,好多做了很多年web的朋友甚至还不太清楚.这应该算是最基础的js知识了.我觉得有必要在这记录一下,方便自己和大家查看. 最基本的,js有五种数据类型:undef ...
- Linq中关键字的作用及用法
Linq中关键字的作用及用法 1.All:确定序列中的所有元素是否都满足条件.如果源序列中的每个元素都通过指定谓词中的测试,或者序列为空,则为 true:否则为 false. Demo: 此示例使用 ...
- 开源一个网络图片浏览器HooPhotoBrowser
在公司开发项目中需要弹出展示从网络上下载的图片,并提供滑动展示功能.目前采用同事开发的图片浏览器,后期有时间想优化一下.所以重温了下以前开发的类似微博的项目中的图片浏览器代码,并抽取出来封装成了现在这 ...
- .net dataGridView当鼠标经过时当前行背景色变色;然后【给GridView增加单击行事件,并获取单击行的数据填充到页面中的控件中】
1.首先在前台dataGridview属性中增加onRowDataBound属性事件 2.然后在后台Observing_RowDataBound事件中增加代码 protected void Obser ...
- [Python]logging模块使用basicConfig后记录日志重复问题
logging.basicConfig配置日志记录到文件A后,再使用logging.FileHandler生成记录到文件B的logger 在使用此logger记录日志时,会同时记录的文件A和文件B,感 ...
- Python学习路程day19
Python之路,Day19 - Django 进阶 本节内容 自定义template tags 中间件 CRSF 权限管理 分页 Django分页 https://docs.djangoproj ...
- PLS入门
PLS入门: 1,两篇关键文章 [1] de Jong, S. "SIMPLS: An Alternative Approach to Partial Least Squares Regre ...