- 博客(378)
- 资源 (50)
- 问答 (1)
- 收藏
- 关注
原创 NSDictionary 内存布局
是iOS开发中经常用到的数据结构。熟悉的内部实现,有助于我们更好的使用它们。同时,在遇到相关崩溃,也能帮助我们更好的分析问题。
2025-06-02 04:38:00
564
原创 WebKit Inside: 渲染树
经过CSS的匹配,就要进入渲染树的构建。渲染树也叫树,因为渲染树上每一个节点,都是的子类。首先来看一下的继承类图。
2025-03-30 14:35:00
822
原创 WebKit Inside: px 与 pt
表示一英寸有多少点,这里的点是在打印时使用的单位。表示一英寸有多少像素,这里的像素是物理像素。语句中跳出,不做任何换算处理,属性值。不同的地方在于,最终的值不是支持存储。从右下角红框输出可知,当前正在处理。,从控制台的输出可以看到,这个值为。从左边调用栈可知,这个过程发生在。字号设置,不同的是,将字号单位从。是物理像素,还是逻辑像素?从代码可以看到,如果是。被直接存储下来使用。那么就可以得出结论,
2025-03-23 17:50:00
315
原创 WebKit Inside: CSS 的匹配原理
从HTML解析成DOM树;到CSS样式表的解析;再到CSS样式表的匹配时机;最后到CSS样式表的匹配过程。WebKit渲染前的处理过程已经结束。WebKit渲染树的构建正等着我们。写到这里,总算告一小段落。✿✿ヽ(°▽°)ノ✿完一小结,撒花!✿✿ヽ(°▽°)ノ✿。
2025-03-18 02:25:00
883
原创 dyld: 神秘的 __dso_handle
iOS动态链接器dyld中有一个神秘的变量__dso_handle:// dyld/dyldMain.cppstatic const MachOAnalyzer* getDyldMH(){#if __LP64__ // 声明 __dso_handle extern const MachOAnalyzer __dso_handle; return &__ds...
2024-11-19 03:01:00
319
原创 一文搞懂 ARM 64 系列: ADD(立即数版)
汇编中,加法指令很重要,因为它是执行其他很多指令的基础。同时,加法指令也会影响NZCV标志。有关NZCV的介绍,可以参看《一文搞懂 ARM 64 系列: ADC》。ARM64汇编中,ADD指令有3种形式,这里介绍第一种形式,也就是与立即数相加。1 指令语法ADD <Xd|SP>, <Xn|Sp>, #imm{, shift}{}里的内容表示是可选的。shift...
2024-11-15 01:35:00
700
原创 一文搞懂 ARM 64: AUTIBSP
1 PAC有关PAC可以参看《一文搞懂 ARM 64: PACIBSP》。2 指令语法AUTIBSP3 指令语义上面指令对寄存器X30或者说寄存器LR的值进行PAC验证。指令AUTIBSP的B代表使用密钥B,同时SP表示「上下文」使用寄存器SP的值。下面是一个运行AUTIBSP后,X30的值的变化例子:// 验证前(lldb) p/x $x30(unsigned long) ...
2024-11-13 02:04:00
350
原创 一文搞懂 ARM 64 系列: PACISB
1 PACAMR64提供了PAC(Pointer Authentication Code)机制。所谓PAC,简单来说就是使用存储在芯片硬件上的「密钥」,一个「上下文」,与「指针地址」进行加密计算,得出一个「签名」,将这个「签名」写入指针的高bit上。计算出来的「签名」之所以可以写入指针的高bit,是因为在实际使用中,并不是所有指针64bit都会被使用,通常高bit都会被保留用来做其他用途...
2024-11-13 01:35:00
635
原创 XCode 编译 PAG 源码
最近工作中要使用PAG替换Lottie,为了方便阅读源码,使用XCode对其源码进行了编译。1 下载源码编译源码首先要下载源码,有关PAG源码可直接到github上下载。2 添加相关依赖下载源码之后,进入到PAG项目根目录,执行如下脚本:./sync_deps.sh3 构建 iOS PAGViewer 工程PAG项目包含多种平台下的代码,包括iOS,Windows,Linux等。我...
2024-07-28 15:46:00
441
原创 一文搞懂 ARM 64 系列: 一文搞懂 ARM 64 系列: 函数调用传参与返回值
函数调用涉及到传参与返回值,下面就来看下ARM 64中,参数与返回值的传递机制。1 整数型参数传递这里的整数型并不单指int类型,或者NSInteger类型,而是指任何能够使用整数表示的数据类型,包括char、BOOL、指针等。对于整数型参数,需要分成参数个数<=8个和>8个两种情形来看。如果参数个数 <=8个,那么参数全部使用Xn寄存器传递。比如,一个函数的参数只有...
2024-06-09 04:50:00
1514
原创 一文搞懂 ARM 64 系列: 寄存器
ARM 64中包含多种寄存器,下面介绍一些常见的寄存器。1 通用寄存器ARM 64包含31个64bit寄存器,记为X0~X30。每一个通用寄存器,它的低32bit都可以被访问,记为W0~W30。在这31个通用寄存器中,有2个寄存器比较特殊。X29寄存器被作为栈帧寄存器,也被称为FP(Frame Pointer Register)。X30寄存器被作为函数返回地址寄存器,也被称为LR(...
2024-06-08 21:44:00
2217
原创 一文搞懂 ARM 64 系列: ADCS
1 指令语法adcs <Xd>, <Xn>, <Xm>2 指令语义上面的指令等价于:(Xd, nzcv) = Xn + Xm + PSTATE.C也就是将寄存器Xn,寄存器Xm,进位标志PSTATE.C相加,将结果写入寄存器Xd,同时,这个指令还会影响PSTATE的NZCV标志。ADCS中的S,正式Set的意思,也就是这个指令会Set PSTATE...
2024-05-10 00:33:00
453
原创 一文搞懂 ARM 64 系列: ADC
1 指令语法adc <Xd>, <Xn>, <Xm>2 指令语义adc就是带「进位」加法,指令中的c就是英文carry。整个指令等价于:(Xd, _) = Xn + Xm + PSTATE.C也就是将寄存器Xn,寄存器Xm,PSTATE中的「进位」标志相加,将相加的结果写入寄存器Xd,但是丢弃相加产生的「进位」。也就是说,adc指令只是使用PST...
2024-05-09 02:19:00
575
原创 ARM64: ARDP
1 指令语法ardp <Xd>, <lable>2 指令语义1 获取程序计数器PC寄存器的值;2 将PC寄存器值的低12位全部取0;3 将lable的值乘以4096,也就是将label左移12位;4 将第2步的PC值与第3步的label值相加;5 将第4步所得结果写入寄存器Xd。从上面步骤可以看出,得到的结果低12位为0,所以得到的是一个4KB页大小的首地...
2024-03-24 14:18:00
394
原创 GCD Inside: GCD 数据结构
1 OS_objectOS_object由下面宏OS_OBJECT_DEC_BASE扩展而来:// 1. os/object.hOS_OBJECT_DECL_BASE(object, NSObject);// 2. os/object.h#define OS_OBJECT_DECL_BASE(name, ...) \ @interface OS_OBJECT_CLASS(name...
2023-11-13 03:02:00
229
原创 GCD Inside: GCD 宏
1 __OBJC____OBJC__宏的定义在 GCD 源码中找不到,它定义在 LLVM 的源码中:// initPreprocessor.cppstatic void InitializeStandardPredefinedMacros(const TargetInfo &TI, con...
2023-11-12 00:17:00
179
原创 UIKit Inside: frame bounds position anchorPoint center
iOS 中UIView的属性:frame、bounds、center以及CALayer的属性:position、anchorPoint与视图的位置与大小相关,理解这些属性是进行 iOS 视图编码的基础。下面从汇编角度看一下这些属性的实现以及相互关系。1 frameframe定义了视图在父视图坐标系下的位置与大小。上图中红色UIView的frame为 {x: 50, y: 50, w...
2023-11-06 04:53:00
303
原创 Mach-O Inside: 命令行工具集 otool objdump od 与 dwarfdump
1 otoolotool 命令行工具用来查看 Mach-O 文件的结构。1.1 查看文件头otool -h -v 文件路径-h选项表明查看 Mach-O 文件头。-v 选项表明将展示的内容进行"符号化"处理。上面命令行输出的一个例子如下:magic cputype cpusubtype caps filetype ncmds sizeofcmds flagsM...
2023-10-29 18:55:00
940
原创 Mach-O Inside: BSS Section
1 BSS 起源BSS(Block Started by Symbol)这个词最初是 UA-SAP 汇编器(United Aircraft Symbolic Assembly Program)中的一个伪指令,用于为符号预留一块内存空间。该汇编器由美国联合航空公司于 20 世纪 50 年代中期为 IBM 704 大型机所开发。后来,BSS 这个词被作为关键字引入了 IBM 709 和 7090...
2023-10-29 01:27:00
147
原创 WebKit Insie: Active 样式表
WebKit Inside: CSS 样式表的匹配时机介绍了当 HTML 页面有不同 CSS 样式表引入时,CSS 样式表开始匹配的时机。后续文章继续介绍 CSS 样式表的匹配过程,但是在匹配之前,首先需要收集页面里面的 Active 样式表。1 Active 样式表在一个 HTML 文件里面,可能会使用<style>标签与<link>标签引入许多样式表,但是这些样式...
2023-10-07 21:18:00
304
原创 WebKit Inside: CSS 样式表的匹配时机
WebKit Inside: CSS 的解析 介绍了 CSS 样式表的解析过程,这篇文章继续介绍 CSS 的匹配时机。无外部样式表内部样式表和行内样式表本身就在 HTML 里面,解析 HTML 标签构建 DOM 树时内部样式表和行内样式就会被解析完毕。因此如果 HTML 里面只有内部样式表和行内样式,那么当 DOM 树构建完毕之后,就可以进行样式表的匹配了。假设 HTML 里面的行内样式在...
2023-10-05 17:03:00
250
原创 WebKit Inside: CSS 样式表的解析
CSS 全称为层叠样式表(CascadingStyleSheet),用来定义 HTML 文件最终显示的外观。为了理解 CSS 的加载与解析,需要对 CSS 样式表的组成,尤其是 CSS Selector 有所了解,相关部分可以参看这里。HTML 文件里面引入 CSS 样式表有 3 种方式:1 外部样式表2 内部样式表3 行内样式不同的引入方式,CSS 加载与解析不一样。CSS ...
2023-10-02 23:02:00
239
原创 WebKist Inside: CSS 样式表的组成
1 StyleSheet一张 StyleSheet 由一系列 Rules 组成,这些 Rules 可以分成 2 大类: 1 Style Rule2 At-Rule下面的例子展示了 Style Rule 和 At-Rule:// Style Rulediv { background-color: red; font-size: 12px;}// At-Rule...
2023-10-01 01:02:00
110
原创 WebKit Inside: CSS 样式表解码字符集
CSS 样式表引入有3种方式: 外部样式表、内部样式表、行内样式,不同的引入方式,解码样式表的字符集原理不一样。外部样式表外部样式表由 link 标签引入,当 WebKit 解析到 link 标签时就会构造 CachedCSSStyleSheet 对象。这个对象持有 CachedResourceRequest 对象和 TextResourceDecoder 对象。CachedResource...
2023-09-30 17:13:00
144
原创 C++ 转换构造函数
在 C++ 中如果一个构造函数只有一个参数,那么这个构造函数就是转换构造函数(Converting Constructor),这个构造函数可以将参数类型转换成构造函数所在的类对应的类型。举个例子,假设有如下类 Complex: 1 class Complex { 2 private: 3 int i; 4 int j; 5 6 public: 7 // ...
2023-09-30 15:06:00
267
原创 CSS 样式表引入的3种方式
CSS 全称为层叠样式表(CascadingStyleSheet),用来定义 HTML 文件最终显示的外观。HTML 文件里引入 CSS 样式有3种方式: 外部样式表、内部样式表、行内样式。外部样式表外部样式表通过 link 标签引入:<link rel='stylesheet' type='text/css' href='https://www.test.com/test.c...
2023-09-30 00:32:00
423
原创 一文搞懂 x64 IA-64 AMD64 Inte64 IA-32e 架构之间的关系
想要搞清楚 x64、IA64、AMD64 指令集之间的关系,就要先了解 Intel 和 AMD 这两家公司在生产处理器上的发展历史。x86 处理器1978年 Intel 生产了它的第一款 16bit处理器8086,之后几款处理器名字也都以86结尾,包括80186,80286, 80386,80486,这些处理器的架构被统一称为 x86 架构。其中8086、80186、80286是 16b...
2023-05-03 12:07:00
3338
原创 Linux-0.11操作系统源码调试
学习操作系统有比较好的两种方式,第一种是跟着别人写一个操作系统出来,《操作系统真相还原》、《Orange's:一个操作系统的实现》等书就是教学这个的;另一种方式就是调试操作系统源码,相比第一种方式,调试源码可以更能感受真实操作系统的实现机制。Linux-0.11 是 Linux 最早期的代码,它包含现代操作系统的所有雏形,代码体量也不大,非常适合对操作系统进行源码学习。下面记录在 Ubuntu...
2022-11-12 15:45:00
1170
1
原创 GDB 中内存打印命令
GDB 中使用 "x" 命令来打印内存的值,格式为 "x/nfu addr"。含义为以f格式打印从addr开始的n个长度单元为u的内存值。参数具体含义如下:a)n:输出单元的个数。b)f:是输出格式。比如x是以16进制形式输出,o是以8进制形式输出,等等。c)u:标明一个单元的长度。b是一个byte,h是两个byte(halfword),w是四个byte(wor...
2022-07-31 15:31:00
352
原创 iOS LLVM 中的宏定义
在阅读 Objc 库源码时常常会遇到很多宏定义,比如宏SUPPORT_INDEXED_ISA、SUPPORT_PACKED_ISA,代码如下所示:// Define SUPPORT_INDEXED_ISA=1 on platforms that store the class in the isa // field as an index into a class table.//...
2022-07-30 19:27:00
416
原创 @weakify 与 @strongify 实现原理
为了解决 Block 造成的循环引用,iOS 开发过程中常常使用 @weakify 与 @strongify 来解决这个问题。下面就来看下 @weakify 与 @strongify 的实现原理。准备知识宏参数(Arguments)的扩展可变参数宏宏定义中的重复副作用宏定义里面为什么要加括号?Block对变量的引用@weakify 和 @strongify 的实现原理就是宏展开,阅...
2022-03-20 16:03:00
889
原创 Block对变量的引用
如果在 Block 内部使用外部的变量,Block 会持有这个变量。下面来看几中特殊的情况,看 Block 对变量的持有情况如何。typeof@interface X : NSObject@property (nonatomic, copy) void(^testBlock1)(void);@property (nonatomic, copy) void(^testBlock2)(v...
2022-03-20 00:50:00
125
原创 宏参数(Arguments)的扩展
宏分为两种,一种是 object-like 宏,比如:#define STR "Hello, World!"另一种是 function-like 宏,比如:#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))对于 function-like 宏,定义时的参数叫 Parameters,比如上面宏 MIN 的参数 X、Y,当调用时,传递的参数叫 A...
2022-03-19 16:16:00
132
原创 可变参数宏
定义宏时可以让宏接收可变参数,对于可变参数的定义,标准 C 和 GNU C(GNU 对 C的扩展)是不一样的。标准 C标准 C 对于可变参数的定义如下,使用...:#define eprintf(...) fprintf (stderr, __VA_ARGS__)在宏定义中,__VA_ARGS__ 代表了所有的可变参数。比如像下面使用宏 eprintf:eprintf ("%s:...
2022-03-19 15:13:00
126
原创 宏定义中的重复副作用
副作用(Side Effect)在计算机当中,副作用指当调用一个函数时,这个函数除了返回一个值之外,还对主调函数产生了影响,比如修改了全局变量,修改了参数等等。宏的重复副作用对于求两个数中的最小数,常常可以定义一个宏 MIN,定义如下:#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))上面的宏在写法上完全没有问题。但是假如有下面的代码:i...
2022-03-19 14:47:00
200
原创 宏定义里面为什么要加括号?
在宏定义当中,常常可以看到宏的参数以及整个宏的定义都被小括号包围,就像下面的 MIN、MAX、ABS 宏一样:上面的图截取自 iOS 的系统库,那为什么它们需要这些括号包围起来呢?下面假如我们自定义了宏 ceil_div,代码如下:#define ceil_div(x, y) (x + y - 1) / y这个宏的本意是将 x 除以 y,然后将得到的结果向上取整。比如 x = 4,...
2022-03-19 13:50:00
1312
1
原创 WebKit Inside: DOM树的构建
当客户端App主进程创建WKWebView对象时,会创建另外两个子进程:渲染进程与网络进程。主进程WKWebView发起请求时,先将请求转发给渲染进程,渲染进程再转发给网络进程,网络进程请求服务器。如果请求的是一个网页,网络进程会将服务器的响应数据HTML文件字符流吐给渲染进程。渲染进程拿到HTML文件字符流,首先要进行解析,将HTML文件字符流转换成DOM树,然后在DOM树的基础上,进行渲染操...
2022-02-21 21:25:00
337
原创 WebKit中WTFMove实现
WTFMove定义位置: WTF/Source/wtf/StdLibExtras.h,其定义如下:#define WTFMove(value) std::move<WTF::CheckMoveParameter>(value)从定义可以看出,WTFMove实际上是封装的std::move方法。当使用WTFMove之后,value值会被置为空。...
2022-02-20 18:59:00
140
由于axis2的三本英文书籍
2015-09-24
C89以及Rational
2014-11-26
elementary functions
2015-09-24
Mac OS X and iOS Internals:To the Apple’s Core.pdf
2020-11-17
Ecma-262规范
2020-11-17
AdvanceAppleDebugging_v0.9.1_SourceCode
2020-11-17
Unicode Standrad
2015-09-24
Git书籍两本打包
2015-09-24
linux只能连接无密码wifi,无法连接有密码wifi
2015-09-08
TA创建的收藏夹 TA关注的收藏夹
TA关注的人