随笔分类 -  iOS 底层探索

摘要:一、类扩展 1、类扩展与分类 category: 准用来给类添加新方法; 不能添加成员变量,即使添加了也无法取到; 属性可添加,但只会生成 setter/getter 的声明而没有相应的实现 --> 可通过 runtime 进行关联实现。 extension: 可看做匿名分类; 可以给类添加成员属性 阅读全文
posted @ 2020-10-22 12:01 张张_z 阅读(330) 评论(0) 推荐(0)
摘要:本文继续衔接 OC 底层探索 14、类的加载2 探索分类的加载。调试源码 一、分类的本质 分类的结构查看方法 1).cpp 文件 在 main.m 中任意添加一个分类信息的 .h .m 文件信息,编译生成cpp文件 clang -rewrite-objc main.m -o main.cpp 如下t 阅读全文
posted @ 2020-10-18 00:27 张张_z 阅读(276) 评论(0) 推荐(0)
摘要:本文衔接 OC 底层探索 13 继续探索类的加载,我们已知通过 readClass() 读取了编译器写的类(or元类),同时给 cls 赋了 name 和把cls 插入到了类/元类的表中,此时cls不仅有了地址还有了 name。此时的类是什么样子的呢?我们读取一下 cls 的内存情况,见下图: 通过 阅读全文
posted @ 2020-10-17 19:35 张张_z 阅读(236) 评论(0) 推荐(0)
摘要:本文开始探索类的加载。调试源码 objc 源码工程 _objc_init 函数: 1 /*********************************************************************** 2 * _objc_init 3 * Bootstrap initi 阅读全文
posted @ 2020-10-12 23:07 张张_z 阅读(433) 评论(0) 推荐(0)
摘要:方法等是如何加载到内存中的呢,或者说类的加载都做了什么?在此之前,我们先探索 APP 从响应用户点击到完全启动的过程 即 应用程序加载 都做了什么事情。 首先我们准备一个 iOS 的 APP 工程,ViewController.m 中添加 load 方法,main.m中添加一个 C++ 的 方法,代 阅读全文
posted @ 2020-10-05 14:57 张张_z 阅读(190) 评论(0) 推荐(0)
摘要:我们已经知道 objc_msgSend 的消息查找流程首先是 缓存 cache 查找,然后是去方法列表递归查找,若一直没有找到消息一般则会 crash 报错找不到该消息。 但是直接crash太过不友好,下面就进行探究苹果给我们的3次机会。 消息处理的流程图: 一、动态方法决议 1、通过简单代码切入 阅读全文
posted @ 2020-09-26 23:59 张张_z 阅读(418) 评论(0) 推荐(0)
摘要:我们已经知道消息发送流程首先会走到缓存 cache 里面,那么当缓存中没有查询到消息时 __objc_msgSend_uncached,后续怎么继续执行呢? 一、切入口 __objc_msgSend_uncached --> MethodTableLookup --> _lookUpImpOrFor 阅读全文
posted @ 2020-09-25 22:38 张张_z 阅读(319) 评论(0) 推荐(0)
摘要:本文对 Runtime 进行简单介绍 和对 objc_msgSend 的发消息流程中的缓存查找进行探索。 更新(流程图概览):缓存查找流程图 我们知道类结构中包含了很多信息:isa superclass cache bits,cache 中缓存了我们调用的方法,具体流程见OC底层探索07. 但是方法 阅读全文
posted @ 2020-09-23 23:56 张张_z 阅读(401) 评论(0) 推荐(0)
摘要:本文来探索类结构中 cache_t. 之前的文章OC底层探索04 中,已知如何找到类信息。本文我们对类信息中的 cache_t 进行探索。 objc_class 结构 : 从 OC底层探索04 中的指针和内存偏移,我们已知可通过指针平移获取相应位置信息,cache_t 的位置 = 8 + 8 =16 阅读全文
posted @ 2020-09-22 21:26 张张_z 阅读(439) 评论(0) 推荐(0)
摘要:isa 2 个经典问题分析 一、类的归属问题 1、2个API objc_getMetaClass() --> 获取元类 class_getMethodImplementation() --> 获取 IMP 2、实例方法 和 类方法 分析 1. 实例方法 class_getInstanceMethod 阅读全文
posted @ 2020-09-21 02:00 张张_z 阅读(281) 评论(0) 推荐(0)
摘要:本文探索属性、成员、实例变量。 一、简介 1、属性变量 @property (nonatomic, copy) NSString *propName; @property:做了什么事?文章后面探索。 为 propName 生成了 set/get 方法的声明和实现,同时为其生成了私有的 ivar 成员 阅读全文
posted @ 2020-09-20 23:16 张张_z 阅读(362) 评论(0) 推荐(0)
摘要:本文内容主要对isa指向流程 和 类的结构以及类中 bits 进行探索。 一、类与 isa 运行 objc源码工程,main.m 文件中断点打在 objc2,读取对象 objc2 的内存如下: 图中,我们发现两个不同的 地址,他们的值都是 MyPerson。这是为何呢?--> 元类 我们继续读取内存 阅读全文
posted @ 2020-09-14 00:01 张张_z 阅读(390) 评论(0) 推荐(0)
摘要:本文开始探索 OC 对象的本质是什么? 一、对象 对象的本质 - 结构体 1、编译后的对象 1、我们在 main.m 文件中做简单代码如下: #import <Foundation/Foundation.h> #import <objc/runtime.h> @interface MyPerson 阅读全文
posted @ 2020-09-13 23:59 张张_z 阅读(253) 评论(0) 推荐(0)
摘要:一、字节对齐 1、为什么要进行字节对齐处理呢? 性能,快,以空间换取时间。 可以想象2个场景,场景1:当我们的CPU去读取内存时,每次读取的大小如果是不确定的(8、7、3、9... ...),那么除非每次读取都要重新改变自己的读取方式否则读取的数据就会读错到其他数据上去。 场景2,如果我们所存储的对 阅读全文
posted @ 2020-09-09 21:13 张张_z 阅读(450) 评论(0) 推荐(0)
摘要:本文介绍 如何探索 alloc 和 alloc 做了什么? objc 可编译源码 从最简单的代码开始: MyPerson *p1 = [MyPerson alloc]; MyPerson *p2 = [p1 init]; MyPerson *p3 = [p1 init]; NSLog(@"%@ - 阅读全文
posted @ 2020-09-08 10:11 张张_z 阅读(384) 评论(0) 推荐(0)