ios
文章平均质量分 90
XA403
一个iOSer,基本功修行中
展开
-
iOS内存基础知识
操作系统的内存机制冯·诺依曼结构在冯·诺依曼结构中,存储器有着重要地位,它存放着程序的指令以及数据,在程序运行时,根据需要提供给 CPU 使用。可以想象,一个理想的存储器,应该是兼顾读写速度快、容量大、价格便宜等特点的,但是鱼和熊掌不可兼得,读写速度越快的存储器也更贵、容量更小。但冯·诺依曼结构存在一个难以克服的问题,被称为冯·诺依曼瓶颈 —— 在目前的科技水平之下,CPU 与存储器之间的读写速率远远小于 CPU 的工作效率。简单来说就是 CPU 太快了,存储器读写速度不够快,造成了 CPU 性能的浪原创 2022-03-29 15:43:15 · 3002 阅读 · 0 评论 -
iOS-runtime的数据结构
对象 & 类对象的关系对象和类对象的整体关系图:注:新版runtime中新增了rwe来优化rw对象(objc_object)struct objc_object {private: isa_t isa;...... } 我们平时用的所有对象都是id类型的,在runtime中 id 就是 objc_object 结构体,而 objc_object 的内容是一个 isa_t 的八字节数据,这个 isa_t 是一个共用体。并包含了以下信息:关于 isa 操作的相原创 2022-03-29 15:42:49 · 223 阅读 · 0 评论 -
iOS-消息转发流程
realizeClassWithoutSwiftrealizeClassWithoutSwift是初始化类的核心方法,主要做了如下事情:读取data数据,设置ro、rw归调用realizeClassWithoutSwift完善类的继承链关系调用methodizeClass,完善类信息(方法、分类的方法、属性列表、协议列表)读取 data 数据,并设置 ro 、rw- ro 表示 read only,其在编译期的时候就已经确定了内存,包含了类的名称、方法列表、协议列表、属性列表和成员变量列表的原创 2022-03-29 15:41:39 · 154 阅读 · 0 评论 -
iOS-类&分类的加载
realizeClassWithoutSwiftrealizeClassWithoutSwift是初始化类的核心方法,主要做了如下事情:读取data数据,设置ro、rw归调用realizeClassWithoutSwift完善类的继承链关系调用methodizeClass,完善类信息(方法、分类的方法、属性列表、协议列表)读取 data 数据,并设置 ro 、rw- ro 表示 read only,其在编译期的时候就已经确定了内存,包含了类的名称、方法列表、协议列表、属性列表和成员变量列表的原创 2022-03-29 15:41:04 · 685 阅读 · 0 评论 -
iOS-objc_init
dyld & objc_init前面我们分析到dyld负责加载App主二进制所依赖的动态库,并对APP、动态库做了一些链接和初始化工作。然后针对有初始化方法的动态库,dyld会调用它们的初始化方法,这里就包括runtime的初始化方法objc_init。这个过程如下图:_objc_initdyld_init是runtime的初始化方法,主要做了以下事情:环境初始化read_image:对各个Image中Class相关数据的初始化和处理load_image:调用+load方法原创 2022-03-29 15:40:29 · 169 阅读 · 0 评论 -
iOS-dyld
dyld在 MacOS 和 iOS 上,可执行程序的启动依赖于 xnu 内核进程运作和动态链接加载器 dyld。dyld 全称 the dynamic link editor,即动态链接器,其本质是 Mach-O 文件,是专门用来加载动态库的库。在 xnu 内核为程序启动做好准备后,执行由内核态切换到用户态,由 dyld 完成后面的加载工作:dyld 会将 App 依赖的动态库加载到内存并做一些初始化的工作。dyld源码下载地址_dyld_start之前我们都知道我们在APP中通过打断点最早能追溯原创 2022-03-29 15:39:56 · 1337 阅读 · 0 评论 -
Mach-O结构分析
可执行文件我们运行一个程序(进程)是把一些特殊文件在内存中加载并运行得到的结果。那么这类文件的格式必须是系统内核可以理解的,系统内核才能正确解析。这类文件被称为可执行的文件。不同操作系统的可执行文件格式不同:在现代通用计算机系统中,虽然不同平台的可执行文件的格式不完全一样,但是原理大体相同,基本都是基于段结构的,可执行文件的结构基本可以分为:header段:用于让操作系统识别可执行文件TEXT段:存放编译后的函数的二进制代码,TEXT段的内容被标记为只读的,可执行的。如果试图修改TEXT段的内原创 2022-03-29 15:39:16 · 1857 阅读 · 0 评论 -
探究OC Runtime
Runtime理解OC是基于C的,在C的基础上扩展出了面向对象的能力,支持其面向对象能力的核心就是OC的runtime机制。OC中我们编写的类,最终按照某种数据结构存储在可执行文件的__DATA段中,然后可执行文件被操作系统加载到进程空间,此时进程空间中就有了各个类和函数的信息。runtime是一个动态链接库,在程序执行过程中,我们通过runtime提供的各种能力,来访问、操作、读写各个类、方法、实例对象。总结来说:OC的面向对象能力 = 类和方法的数据结构(数据结构也由runtime定义)+ 算法(r原创 2022-03-29 15:20:47 · 176 阅读 · 0 评论