- 博客(362)
- 资源 (50)
- 问答 (1)
- 收藏
- 关注
原创 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 107
原创 GCD Inside: GCD 宏
1 __OBJC____OBJC__宏的定义在 GCD 源码中找不到,它定义在 LLVM 的源码中:// initPreprocessor.cppstatic void InitializeStandardPredefinedMacros(const TargetInfo &TI, con...
2023-11-12 00:17:00 98
原创 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 166
原创 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 215
原创 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 48
原创 WebKit Insie: Active 样式表
WebKit Inside: CSS 样式表的匹配时机介绍了当 HTML 页面有不同 CSS 样式表引入时,CSS 样式表开始匹配的时机。后续文章继续介绍 CSS 样式表的匹配过程,但是在匹配之前,首先需要收集页面里面的 Active 样式表。1 Active 样式表在一个 HTML 文件里面,可能会使用<style>标签与<link>标签引入许多样式表,但是这些样式...
2023-10-07 21:18:00 217
原创 WebKit Inside: CSS 样式表的匹配时机
WebKit Inside: CSS 的解析 介绍了 CSS 样式表的解析过程,这篇文章继续介绍 CSS 的匹配时机。无外部样式表内部样式表和行内样式表本身就在 HTML 里面,解析 HTML 标签构建 DOM 树时内部样式表和行内样式就会被解析完毕。因此如果 HTML 里面只有内部样式表和行内样式,那么当 DOM 树构建完毕之后,就可以进行样式表的匹配了。假设 HTML 里面的行内样式在...
2023-10-05 17:03:00 164
原创 WebKit Inside: CSS 样式表的解析
CSS 全称为层叠样式表(CascadingStyleSheet),用来定义 HTML 文件最终显示的外观。为了理解 CSS 的加载与解析,需要对 CSS 样式表的组成,尤其是 CSS Selector 有所了解,相关部分可以参看这里。HTML 文件里面引入 CSS 样式表有 3 种方式:1 外部样式表2 内部样式表3 行内样式不同的引入方式,CSS 加载与解析不一样。CSS ...
2023-10-02 23:02:00 132
原创 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 50
原创 WebKit Inside: CSS 样式表解码字符集
CSS 样式表引入有3种方式: 外部样式表、内部样式表、行内样式,不同的引入方式,解码样式表的字符集原理不一样。外部样式表外部样式表由 link 标签引入,当 WebKit 解析到 link 标签时就会构造 CachedCSSStyleSheet 对象。这个对象持有 CachedResourceRequest 对象和 TextResourceDecoder 对象。CachedResource...
2023-09-30 17:13:00 79
原创 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 69
原创 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 111
原创 一文搞懂 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 2130
原创 Linux-0.11操作系统源码调试
学习操作系统有比较好的两种方式,第一种是跟着别人写一个操作系统出来,《操作系统真相还原》、《Orange's:一个操作系统的实现》等书就是教学这个的;另一种方式就是调试操作系统源码,相比第一种方式,调试源码可以更能感受真实操作系统的实现机制。Linux-0.11 是 Linux 最早期的代码,它包含现代操作系统的所有雏形,代码体量也不大,非常适合对操作系统进行源码学习。下面记录在 Ubuntu...
2022-11-12 15:45:00 826 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 231
原创 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 263
原创 @weakify 与 @strongify 实现原理
为了解决 Block 造成的循环引用,iOS 开发过程中常常使用 @weakify 与 @strongify 来解决这个问题。下面就来看下 @weakify 与 @strongify 的实现原理。准备知识宏参数(Arguments)的扩展可变参数宏宏定义中的重复副作用宏定义里面为什么要加括号?Block对变量的引用@weakify 和 @strongify 的实现原理就是宏展开,阅...
2022-03-20 16:03:00 628
原创 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 80
原创 宏参数(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 78
原创 可变参数宏
定义宏时可以让宏接收可变参数,对于可变参数的定义,标准 C 和 GNU C(GNU 对 C的扩展)是不一样的。标准 C标准 C 对于可变参数的定义如下,使用...:#define eprintf(...) fprintf (stderr, __VA_ARGS__)在宏定义中,__VA_ARGS__ 代表了所有的可变参数。比如像下面使用宏 eprintf:eprintf ("%s:...
2022-03-19 15:13:00 77
原创 宏定义中的重复副作用
副作用(Side Effect)在计算机当中,副作用指当调用一个函数时,这个函数除了返回一个值之外,还对主调函数产生了影响,比如修改了全局变量,修改了参数等等。宏的重复副作用对于求两个数中的最小数,常常可以定义一个宏 MIN,定义如下:#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))上面的宏在写法上完全没有问题。但是假如有下面的代码:i...
2022-03-19 14:47:00 120
原创 宏定义里面为什么要加括号?
在宏定义当中,常常可以看到宏的参数以及整个宏的定义都被小括号包围,就像下面的 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 799 1
原创 WebKit Inside: DOM树的构建
当客户端App主进程创建WKWebView对象时,会创建另外两个子进程:渲染进程与网络进程。主进程WKWebView发起请求时,先将请求转发给渲染进程,渲染进程再转发给网络进程,网络进程请求服务器。如果请求的是一个网页,网络进程会将服务器的响应数据HTML文件字符流吐给渲染进程。渲染进程拿到HTML文件字符流,首先要进行解析,将HTML文件字符流转换成DOM树,然后在DOM树的基础上,进行渲染操...
2022-02-21 21:25:00 262
原创 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 79
原创 HTML link标签中preload,prefetch,dns-prefetch,preconnect,prerender
Preload在我们的浏览器加载资源的时候,对于每一个资源都有其自身的默认优先级,倘若我们能修改每一个资源的默认优先级,那我们几乎可以按照我们的预期加载想要加载的资源。以谷歌浏览器为例,我们打开控制台,并切换到Network选项,点击刷新页面,在网络下面的title一行点击鼠标右键,勾选Priority即可看到加载资源的优先级,我们可以看到样式的级别比脚本的优先级高,毕竟页面的一加载进来...
2021-06-12 20:49:00 962
原创 JS的异步加载
异步加载先看一张整体的异步加载对渲染的阻塞情况图,图片如下:从这张图里我们可以看到如下4点:默认情况HTML解析,然后加载JS,此时HTML解析中断,然后执行JS,最后JS执行完成恢复HTML解析defer情况下HTML和JS并驾齐驱,最后才执行JSasync情况则HTML和JS并驾齐驱,JS的执行可能在HTML解析之前就已经完成了最后module情况和defer的情况类似,只不...
2021-06-12 20:14:00 66
原创 link标签的media属性
media属性表示被链接的文档将显示在什么设备上。比如下面的例子:<head><link rel="stylesheet" type="text/css" href="theme.css" /><link rel="stylesheet" type="text/css" href="print.css" media="print"/></hea...
2021-06-12 17:35:00 183
原创 安装XMind如何安装到指定目录
在Win10系统上安装XMind,发现安装完成之后,XMind被安装到了C盘。由于C盘是系统盘,这让人很不爽。XMind在安装过程中也没有提供安装路径选择,而是点击安装程序之后,就一路开始安装到C盘。为了让XMind安装到我们指定的位置,我们需要做如下操作:1 按住Win + r,出现如下界面,在输入框中输入regedit,点击确定2 这个时候会弹出注册表编辑器,按如下路径选择:计算机...
2021-06-02 00:42:00 674
原创 显示器AVG、DVI、HDMI、DisplayPort、Type-C、雷电接口
在近十年的发展,显示设备的接口发生了巨大的改变。以前使用比较多的是蓝色VGA接口,接著出现了白色的DVI接口,当遇到不同接口时,还得买转接头进行转接。后来,又有了HDMI等接口,现在则出现DP和USB Type-C接口。那么,这么多接口,到底有什么区别,又应该用哪个呢?VGAVGA接口也称为D-Sub接口。在CRT显示器时代,VGA接口是必备的。因为CRT是模拟设备,而VGA采用的...
2021-05-30 18:59:00 1335
原创 SATA与PCI-E速度对比
SATASATA接口已经发展到了第三代,理论上的最大速度达到600MB/s。平时大家见到的SATA SSD使用的都是SATA三代,实际测试速度在550MB/s左右,这比普通的机械硬盘的速度100MB/s左右快了数倍。GenerationSpeedSpecial FeaturesSATA 1.01.5Gbs(150 MB/s)SATA 2.03Gbs(300 MB...
2021-05-30 18:23:00 1045
原创 SRAM、DRAM、Flash、DDR有什么区别
SRAMSRAM的全称是Static Rnadom Access Memory,翻译过来即静态随机存储器。这里的静态是指这种存储器只需要保持通电,里面的数据就可以永远保持。但是当断点之后,里面的数据仍然会丢失。由于SRAM的成本很高,所以像诸如CPU的高速缓存,才会采用SRAM。DRAMDRAM全称是Dynamic Random Access Memory,翻译过来即动态随机存取存储器,最...
2021-05-30 17:31:00 511
原创 USB3.0与Type-C接口的关系
USB全称为Universal Serial Bus,翻译过来就是通用串行总线,是连接计算机与外部设备的一种串口总线标准。USB的发展经历了一下阶段:USB1.0:1.5Mbps(192KB/s)低速(Low-Speed)500mA,1996年1月;USB1.1:12Mbps(1.5MB/s)全速(Full-Speed)500mA,1998年9月;USB2.0:480Mbps(60MB/s)高...
2021-05-30 16:27:00 533
原创 一图明白ACHI,SATA之间的关系
从上图中可以看到,SATA与PCI-E不仅可以指代物理的接口,还可以指代物理接口使用的传输协议。M.2物理接口可以使用SATA、PCI-E传输协议。U.2可以使用PCI-E传输协议。在网上搜了一下,U.2接口也是可以兼容SATA接口的,但是上面的图没有展示这一点。上层协议上层协议是主机内存与存储设备之间的一种通用接口,也就是说在不同操作系统与硬件中是通用的。AHCI全称是Advan...
2021-05-30 15:27:00 631
原创 U.2与M.2接口
U.2接口U.2接口别称SFF-8639,是由固态硬盘形态工作组(SSD Factor Work Group)推出的接口规范。U.2接口不但能支持SATA-Express(一种PCI-E与SATA混合的接口),还能兼容SAS、SATA接口。M.2接口M.2接口原名NGFF接口,它是为超极本量身定做的新一代接口标准,主要用来取代mSATA接口,具备体积小、传输速度快等优点。M.2接口可以兼容...
2021-05-30 14:38:00 406
原创 PCI-E与SATA SSD
为什么要采用PCI-E通道目前在固态硬盘SSD中,有一部分采用了SATA3.0接口,而一些高端的固态硬盘则采用了PCI-E接口。那么为什么高端固态硬盘要采用PCI-E接口呢?为了弄清楚这个问题,先看一下硬盘在这两种接口下的工作原理。在传统的SATA硬盘中,当进行数据操作时,数据会先从硬盘读取到主机内存,然后再将数据从内存提取到CPU内部进行计算。CPU计算完之后,先将数据写到内存,然后再从内...
2021-05-30 13:59:00 49
原创 硬盘接口
硬盘接口是硬盘与主机系统之间的连接部件,作用是在硬盘缓冲区与主机内存之间传输数据。不同的硬盘接口决定着硬盘与主机之间的数据传输速度,硬盘接口的优劣直接影响着程序运行的快慢与主机的性能。目前硬盘接口可以分为IDE,SATA,SCSI,SAS与光纤通道。IDEIDE的全称是Integrated Drive Electronics,翻译成中文就是电子集成驱动器。这是一种比较古老的并行接口,目前在...
2021-05-30 13:38:00 60
原创 Linux中典型的文件权限问题
总结起来说,可以打个比方,目录就像一间上了锁有窗户的屋子。如果你只想看屋子里面有啥,那么只要拥有r权限,不必进入到屋子,透过屋子的窗户就能看到里面的东西;但是如果你想改变屋子里面的物件,或者从屋子里面拿一件东西出来看看,那么前提是你至少能够进入屋子,也就是说至少得拥有x权限。...
2021-05-29 22:52:00 28
原创 Linux中的find
find命令在硬盘上进行文件的查找,比起whereis与locate会比较耗时。与时间有关的选项在Linux当中一个文件有mtime,ctime,atime,find在搜索时可以配置这3种时间。比如搜索4天内被改过的文件: find /var -mtime -4;比如搜索4天前的那一天被改动过的文件: find /var -mtime 4;比如搜索4天前被改动过的文件: find ...
2021-05-29 22:27:00 37
原创 Linux中的which whereis locate
whichwhich会在PATH环境中搜寻可执行文件whereisLinux会将系统里面所有的文件都搜集到一个数据库文件中,whereis从这个数据库文件里面寻找文件locatelocate的使用很简单,直接在命令后面输入文件名或者部分名称,就能得到结果。locate和whereis一样,也是在数据库文件里面查询。那么这个数据库在哪里呢?答案就是/var/lib/mlocat...
2021-05-29 22:04:00 41
原创 在Linux下想要删除一个目录需要怎样的权限
场景一在Home目录下创建一个目录dirtest,然后使用chmod 333 dirtest修改目录权限。这时候dirtest的权限为d-wx-wx-wx,如果执行rm -r dirtest可以进行目录的删除。场景二在Home目录下创建一个目录dirtest,然后使用touch命令在dirtest目录创建一个空文件a,然后使用chmod 333 dirtest修改目录权限。这时候dirte...
2021-05-29 21:48:00 171
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
elementary functions
2015-09-24
由于axis2的三本英文书籍
2015-09-24
C89以及Rational
2014-11-26
linux只能连接无密码wifi,无法连接有密码wifi
2015-09-08
TA创建的收藏夹 TA关注的收藏夹
TA关注的人