随笔分类 - iOS
摘要:一、类扩展 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++ 的 方法,代
阅读全文
摘要:我们已经知道 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
阅读全文
摘要:isa 2 个经典问题分析 一、类的归属问题 1、2个API objc_getMetaClass() --> 获取元类 class_getMethodImplementation() --> 获取 IMP 2、实例方法 和 类方法 分析 1. 实例方法 class_getInstanceMethod
阅读全文
摘要:本文探索属性、成员、实例变量。 一、简介 1、属性变量 @property (nonatomic, copy) NSString *propName; @property:做了什么事?文章后面探索。 为 propName 生成了 set/get 方法的声明和实现,同时为其生成了私有的 ivar 成员
阅读全文
摘要:本文主要介绍 Block 的三种类型。 OC底层探索26、Block 原理 一、Block 是什么? 在 OC 文档的 Working with Blocks 中: Blocks are Objective-C objects, which means they can be added to co
阅读全文
摘要:本文内容主要对isa指向流程 和 类的结构以及类中 bits 进行探索。 一、类与 isa 运行 objc源码工程,main.m 文件中断点打在 objc2,读取对象 objc2 的内存如下: 图中,我们发现两个不同的 地址,他们的值都是 MyPerson。这是为何呢?--> 元类 我们继续读取内存
阅读全文
摘要:本文开始探索 OC 对象的本质是什么? 一、对象 对象的本质 - 结构体 1、编译后的对象 1、我们在 main.m 文件中做简单代码如下: #import <Foundation/Foundation.h> #import <objc/runtime.h> @interface MyPerson
阅读全文
摘要:一、字节对齐 1、为什么要进行字节对齐处理呢? 性能,快,以空间换取时间。 可以想象2个场景,场景1:当我们的CPU去读取内存时,每次读取的大小如果是不确定的(8、7、3、9... ...),那么除非每次读取都要重新改变自己的读取方式否则读取的数据就会读错到其他数据上去。 场景2,如果我们所存储的对
阅读全文
摘要:本文介绍 如何探索 alloc 和 alloc 做了什么? objc 可编译源码 从最简单的代码开始: MyPerson *p1 = [MyPerson alloc]; MyPerson *p2 = [p1 init]; MyPerson *p3 = [p1 init]; NSLog(@"%@ -
阅读全文
摘要:RunLoop 源码地址 RunLoop 官方文档 Threading Programming Guide 一、Runloop 介绍 1、RunLoop 是什么? 运行循环是与线程相关联的基础设施的一部分。运行循环是一个事件处理循环,用于调度工作和协调接收传入事件。 运行循环的目的是让线程在有工作要
阅读全文
摘要:本文主要用来 对 SDWebImage 的整体实现原理和源码进行简单解析。 SDWebImage 架构图: 流程简概: 图片加载流程 一、加载图片流程 加载图片时,首先 图片是在本地缓存还是网络 - (void)sd_internalSetImageWithURL:(nullable NSURL *
阅读全文
摘要:前段时间升级了Xcode8,整体来说对OC的影响不大,但是还是跳一个坑,消耗了不少时间。这里总结下遇到的适配问题。 1、权限问题 Xcode8 访问相机、相册等需要权限的地方崩溃 解决办法: 在使用私有权限时,添加Info.plist文件中添加配置: 下面是各种key,需要哪个添哪个 NSBluet
阅读全文
摘要:支付宝快捷支付: 官方文档中,支付宝说建议我们使用支付时要讲签名过程放在服务器端,这样安全。同时给的demo中签名是在本地移动端做的。。。不过支付宝的集成还是较简单的。 为了安全签名当然放后台做了。我实现支付的过程中主要遇到是参数问题,最后提,先大概梳理一下流程。 1.当然第一步是注册账号,创建应用
阅读全文

浙公网安备 33010602011771号