这篇文章我们将针对2个问题来研究:

一、Category的实现原理?

二、 Category和Extension的区别是什么?

简介:

Category是Objective-C 2.0之后添加的语言特性,分类、类别其实都是指的Category。Category的主要作用是为已经存在的类添加方法。

Objective-C 中的 Category 就是对装饰模式的一种具体实现。它的主要作用是在不改变原有类的前提下,动态地给这个类添加一些方法。

知识回顾:

上面截图就是Category的具体实现,我们知道oc的运行时,调用run、eat、test方法其实是在内部objc_msgSend(person,@selector(eat))方法,由之前的博客知识,我们知道,对象方法都是存在类对象里面,test和eat分类是自己生成了一个派生类吗?是这样吗?你可能有这样的疑问,实际上不是这样的,类只有一个类对象,接下来我们就去看看这个问题。

我们利用终端把Test、eat分类转成底层的c++文件,利用:xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc GDPerson+Test.m

我这里只转一个文件,另一个文件也是一样,大家可以尝试,其实分类的信息都是会生成一个叫做 _category_t的一个结构体,里面分别name(名字),cls,instance_methods(对象方法)、class_methods(类方法)、protocols(协议信息)、properties(属性)。其实它是由几个分类,就会生成几个_category_t,上面是2个就会生成2个_category_t,上面的第二张就是传的值,可以看得很清楚,只有一个Test方法,如果你写2个方法转一下c++文件,就会有2个,大家都可以自己尝试。这里也可以看出,编译的时候并没有生产什么新的类!

窥探源码解读:(opensource.apple网址下载)

这里我们去看一下,源码的实现,由于源码的步骤比较多,无法全部列出来,我把源码找的顺序发一下,然后列一下最终找到的结果和实现

那个上面图中最后一步:realloc、memmove和memcpy是比较之前的版本,请看我下面的截图,是最新的版本

然后我们找一下attachLists的方法具体实现

从这我们可以得出一些总结,

结论:

一、Category的加载过程是什么?

1.通过runtime加载某个分类的所有Category数据

2.把所有的Category的方法、属性、协议数据合并到一个大数组中后面参与编译的Category数据会在数组的前面

3.将合并后的分类数据(方法、属性、协议等)插入到类原来的数据中

二、Category的实现原理?

1.Category编译之后的的底层结构是struct category_t,里面存储着分类的对象方法、类方法、属性、协议信息

2.在程序运行的时候,runtime会将category的数据,合并到类信息中(类对象、元类对象)

三、Category和Class Extension的区别是什么?

Class Extension是在编译的时候它的数据就保存在类信息中,而Category是在运行时,才将数据合并到类信息中。

接下来博客我会介绍iOS类别(Category关于load的底层知识)的其他底层知识.

如果觉得我写得对您有所帮助,请关注我,我会持续更新

Category的底层分析相关推荐

  1. Android底层隐私数据,Android Intent传递数据底层分析详细介绍_Android_脚本之家

    Android  Intent传递数据底层分析详细介绍 我们知道在Activity切换时,如果需要向下一个ActivityB传递数据,可以借助Intent对象的putExtra方法. 但是不知各位有没 ...

  2. 【Python基础避坑】函数内存底层分析,全局变量/局部变量,参数传递,浅拷贝/深拷贝

    老高说,基本功不扎实会在工作中遇到很多的坑,非常同意- 函数定义示例 1.含有返回值 # -*-coding:utf-8-*- def add(a, b):'''两数相加'''sum = a + br ...

  3. C++11 std::shared_ptr的std::move()移动语义底层分析

    std::shared_ptr的std::move()移动语义底层分析 执行std::move()之前: 执行std::move()之后: 结论:一个浅拷贝 sizeof(std::shared_pt ...

  4. android中intent放数据类型,Android Intent传递数据底层分析详细介绍

    Android  Intent传递数据底层分析详细介绍 我们知道在Activity切换时,如果需要向下一个ActivityB传递数据,可以借助Intent对象的putExtra方法. 但是不知各位有没 ...

  5. String的底层分析 (学习笔记)

    StringTable底层分析 String的基本特性 StringPool String的内存分配 字符串的拼接操作 拼接效率的对比 intern()的理解 new String("&qu ...

  6. android 4.4 电池电量管理底层分析(C\C++层)

    参考文献:http://blog.csdn.net/wlwl0071986/article/details/38778897 简介: Linux电池驱动用于和PMIC交互.负责监听电池产生的相关事件, ...

  7. 【PHP开源产品】Ecshop的商品筛选功能实现分析之一(主要对category.php进行分析)

    [PHP开源产品]Ecshop的商品筛选功能实现分析之一(主要对category.php进行分析) 一.首先,说明一下为什么要对category.php文件进行分析. (1)原因如下: ①个人对商城类 ...

  8. ①、iOS-RAC的开发用法-底层分析以及总结

    iOS RAC系列 ①.iOS-RAC的开发用法-底层分析以及总结 ②.iOS-RAC-核心类分析-RACPassthroughSubscriber订阅者-RACScheduler调度者-RACDis ...

  9. 结合 category 工作原理分析 OC2.0 中的 runtime

    绝大多数 iOS 开发者在学习 runtime 时都阅读过 runtime.h 文件中的这段代码: struct objc_class {Class isa OBJC_ISA_AVAILABILITY ...

最新文章

  1. java 模式匹配算法_用Java匹配模式
  2. log4j.properties
  3. mysql的orm框架_Mysql-Sqlalchemy-ORM框架
  4. 敏捷开发系列学习总结(4)—Git管理工具sourcetree的安装
  5. Spring Swagger URL传参问题(转)
  6. spring中cglib动态代理
  7. 分享几款好用到爆的 Chrome 插件!!你们不用,我寝食难安……
  8. Qt Http下载器
  9. 腾讯计算机编程本科年薪,腾讯程序员年薪80万,却感慨:天花板太低,想放弃工作去读研!...
  10. imp执行错误IMP-00010
  11. Mblog 系统配置
  12. [NOIP模拟测试30]题解
  13. 图片识别项目 是商品包装识别分类
  14. ${1+$@}是什么意思 (What does ${1+$@} mean)?
  15. composer 安装阿里云sdk
  16. i++ 、 ++i和i+=1、i=i+1 的问题
  17. 空间存储公链(SSCC)空间矩阵裂变机制上线基本介绍
  18. 关于AS报 主版本 52 比 51 新, 此编译器支持最新的主版本。 建议升级此编译器 问题
  19. shell脚本系列:5、shell参数
  20. python对考大学有用吗_2020为啥一定要学Python,献上学习大礼包,拿走不谢,建议收藏!...

热门文章

  1. 飞机馆_熟知航空知识,传承航空文化:杭集小学生走进扬州航空馆
  2. 在MOSS中开发和部署Infopath
  3. 国内主流CMS、SNS、商城等建站系统汇总
  4. python语言基本语句-python基本语句
  5. for循环-结束循环
  6. 走进音视频的世界——视频封装格式
  7. 温湿度绝对含水量换算公式
  8. 小学计算机打字基础知识教案绿色圃,小学信息技术公开课教案智能ABC输入法教学设计与反思...
  9. 自己动手编写ssh登陆管理工具
  10. 如何用互联网技术和思维,优化传统商业的价值链,注入新的商业智慧