摘要:
一、类扩展 1、类扩展与分类 category: 准用来给类添加新方法; 不能添加成员变量,即使添加了也无法取到; 属性可添加,但只会生成 setter/getter 的声明而没有相应的实现 --> 可通过 runtime 进行关联实现。 extension: 可看做匿名分类; 可以给类添加成员属性 阅读全文
摘要:
本文继续衔接 OC 底层探索 14、类的加载2 探索分类的加载。调试源码 一、分类的本质 分类的结构查看方法 1).cpp 文件 在 main.m 中任意添加一个分类信息的 .h .m 文件信息,编译生成cpp文件 clang -rewrite-objc main.m -o main.cpp 如下t 阅读全文
摘要:
本文衔接 OC 底层探索 13 继续探索类的加载,我们已知通过 readClass() 读取了编译器写的类(or元类),同时给 cls 赋了 name 和把cls 插入到了类/元类的表中,此时cls不仅有了地址还有了 name。此时的类是什么样子的呢?我们读取一下 cls 的内存情况,见下图: 通过 阅读全文
摘要:
本文开始探索类的加载。调试源码 objc 源码工程 _objc_init 函数: 1 /*********************************************************************** 2 * _objc_init 3 * Bootstrap initi 阅读全文
摘要:
方法等是如何加载到内存中的呢,或者说类的加载都做了什么?在此之前,我们先探索 APP 从响应用户点击到完全启动的过程 即 应用程序加载 都做了什么事情。 首先我们准备一个 iOS 的 APP 工程,ViewController.m 中添加 load 方法,main.m中添加一个 C++ 的 方法,代 阅读全文
摘要:
本文用来了解数据结构与算法的一些基础。 书籍推荐:《大话数据结构 - 程杰 著》 一、算法 1、算法特性 算法:解决特定问题的一步步思路方法步骤。在计算机中其表现在指令的有限序列,每个指令包含一或多个操作。 算法特性: 有输入输出 有穷性 - 有限步骤内完成,不能无限循环 确定性 - 有确定结果,不 阅读全文
摘要:
我们已经知道 objc_msgSend 的消息查找流程首先是 缓存 cache 查找,然后是去方法列表递归查找,若一直没有找到消息一般则会 crash 报错找不到该消息。 但是直接crash太过不友好,下面就进行探究苹果给我们的3次机会。 消息处理的流程图: 一、动态方法决议 1、通过简单代码切入 阅读全文
摘要:
我们已经知道消息发送流程首先会走到缓存 cache 里面,那么当缓存中没有查询到消息时 __objc_msgSend_uncached,后续怎么继续执行呢? 一、切入口 __objc_msgSend_uncached --> MethodTableLookup --> _lookUpImpOrFor 阅读全文
摘要:
本文对 Runtime 进行简单介绍 和对 objc_msgSend 的发消息流程中的缓存查找进行探索。 更新(流程图概览):缓存查找流程图 我们知道类结构中包含了很多信息:isa superclass cache bits,cache 中缓存了我们调用的方法,具体流程见OC底层探索07. 但是方法 阅读全文
摘要:
本文来探索类结构中 cache_t. 之前的文章OC底层探索04 中,已知如何找到类信息。本文我们对类信息中的 cache_t 进行探索。 objc_class 结构 : 从 OC底层探索04 中的指针和内存偏移,我们已知可通过指针平移获取相应位置信息,cache_t 的位置 = 8 + 8 =16 阅读全文