iOS 底层进阶
文章平均质量分 86
iOS 底层进阶笔记、
Holothurian
千里之行跬步起、江海之成小流积。有志始知蓬莱近、无为总觉咫尺远。
展开
-
iOS 高级强化汇总
1、iOS 多环境配置2、iOS xcconfig文件配置3、iOS Mach-O文件再解读4、链接与符号表5、全局符号的理解6、导入导出符号与map文件7、iOS Weak Symbol8、iOS strip 与 dead strip9、all_load与Objc与force_load10、iOS编译命令小结11、静态库的理解12、Framework原理探索13、动态库链接image not found问题本质...原创 2021-09-10 15:55:35 · 239 阅读 · 0 评论 -
GCD栅栏函数和信号量
概述这里我们将会对GCD的其他部分进行应用及底层探索,主要分为以下几个部分栅栏函数信号量调度组定时器一、栅栏函数栅栏函数最直接的作用是:控制任务执行顺序dispatch_barrier_async:前面的任务执行完毕才会来到这里dispatch_barrier_sync: 前面的任务执行完毕才会来到这里,但是这个会堵塞线程,影响后面的任务执行.非常重要的一点是: 栅栏函数只能控制同一并发队列.1.1 dispatch_barrier_async查看一个加载案例、猜测它原创 2021-09-08 11:17:15 · 716 阅读 · 0 评论 -
GCD同步函数死锁的本质&GCD单例底层探索
疑问点同步函数与异步函数的区别?能否开辟线程任务的回调是否具备异步性/同步性结合队列(串行/并发)时产生死锁问题1 概述经过前篇的探索、其实已经对GCD的底层源码回调的调用流程有了一个系统的理解. 本篇用来补充拓展、带着疑问进行源码探索. 探索的源码采用 **libdispatch-1271.120.2 **版本.2 函数与队列搭配的特性:同步函数 dispatch_sync串行队列DISPATCH_QUEUE_SERIAL不会开启线程,在当前线程执行任务任务串行执行,原创 2021-08-23 00:12:49 · 428 阅读 · 0 评论 -
GCD概念总结&GCD同步/异步函数全局队列底层调用流程探索
GCD总结性概述1、GCD是:Grand Central Dispatch 、纯C语言,提供了非常多的强大函数。2、GCD的优势:GCD是苹果公司为多核的并行运算提出的解决方案、GCD会自动利用更多的CPU内核(双核、四核)GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)、程序员只需要高度GCD想要执行什么任务,不需要编写任何线程管理代码3、GCD是将任务添加到队列、并且指定执行任务的函数任务使用block封装任务的block没有参数也没有返回值执行任务的函数异原创 2021-08-08 23:40:01 · 512 阅读 · 0 评论 -
多线程基本概念&线程与进程&线程调度与优先级&多线程的意义&可调度线程池&时间片&自旋锁和互斥锁
`线程调度`自多线程操作系统问世以来就不断地被提出不同的方案和算法。现在主流的调度方式尽管各不相同,但都带有`优先级调度(Priority Schedule)`和 `轮转法(Round Robin)`的痕迹。所谓**轮转法** ,即是之前提到的让各个线程轮流执行一小段时间的方法。这决定了线程之间交错执行的特点。而`优先级调度`则决定了线程按照什么顺序轮流执行。在具有优先级调度的系统中,线程都拥有各自的**线程优先级(Thread Priority)**。原创 2021-08-05 00:21:40 · 977 阅读 · 0 评论 -
类的加载原理&懒加载类&非懒加载类&分类的本质
前言虽然底层的探索道路充满艰辛、但仍需砥砺前行。争取早日透过现象看本质、见微知著。根据前面的_dyld_objc_notify_register探索流程、我们已经探索到了_read_images中从MachO读取类地址、重定位到dyld加载镜像中类具体的符号。从地址到具体类符号信息。接下来我们还要对 _read_images中其他部分进行探索,因为当前只看到了类的名称从Mach-O符号表中加载进入程序、然而类中的ro,rw,rwe,methodlist,protocol,ivar并没有看到赋值加载原创 2021-08-04 14:53:42 · 619 阅读 · 0 评论 -
iOS 底层进阶
1、objc4-818.2编译踩坑总结篇2、底层探索开篇alloc流程3、内存空间的探索4、对象本质 & nonpointer isa &联合体 &位域12.应用程序加载13.底层 objc_init & read_images分析原创 2021-07-18 02:15:19 · 298 阅读 · 0 评论 -
objc_init & read_images分析
引言应用程序的加载是通过dyld动态链接器链接images镜像文件,images映射到当前程序中,然而它还没有变成内存,也就是当前只是一个库和库的名称,并没有加载到内存中。比如当前有个类HSPerson通过了初始化器完成了初始化、那么我们需要调用相关的方法、协议、拓展,现在缺少一个加载进内存的过程。这就是我们接下来探究的:类的加载原理。当前读取到的镜像文件都是MachO文件,怎么把MachO中的内容、通过地址把其中的代码段、数据段等数据读取到相应的内存中,假设内存中有一个类的信息表去承接MachO原创 2021-07-18 02:09:42 · 338 阅读 · 1 评论 -
应用程序加载
引言前面的学习、让我们知道了如何加载一些数据、比如alloc对象、类、类中的属性、方法、协议;这些都是通过一些代码来写进内存中、也就是符号写进内存中。那么这些符号是如何写进内存中的?这就需要一个过程。其实不止上边说的那些、还有一些系统动静态库:UIKit、Foundation、CoreFoundation等、这些动静态库需要加载到文件中供应用程序使用,那么程序运行后他们是怎么加载到内存中的呢?前面说过很多次的表象符号 objc_init这又是怎么来的呢?或者说objc底层是如何提供的呢?带着上述原创 2021-07-14 23:53:27 · 750 阅读 · 1 评论 -
对象本质 & nonpointer isa &联合体 &位域
一、clang初探1.clang简介clang是一个C语言、C++、Objective-C语言的轻量级编译器。源代码发布于BSD协议下;Clang将支持其普通lambda表达式、返回类型的简化处理以及更好的处理constexpr关键字。Clang是一个由Apple主导编写,基于LLVM的C/C++/Objective-C编译器2013年4月,Clang已经全面支持C++11标准,并开始实现C++1y特性(也就是C++14,这是C++的下一个更新版本)。Clang将支持其普通lambda表达式、返原创 2021-07-09 19:06:18 · 512 阅读 · 0 评论 -
内存空间的探索
一、先上一些对地址进行lldb调试命令的解释x/uf <address>n表示要显示的内存单元的个数u表示一个地址单元的长度:b表示单字节h表示双字节w表示四字节g表示八字节—————f表示显示方式,可取如下值:x按十六进制格式显示变量d按十进制格式显示变量u按十进制格式显示无符号整型o按八进制格式显示变量t按二进制格式显示变量a按十六进制格式显示变量i指令地址格式c按字符格式显示变量f按浮点数格式显示变量常用的是 x/4gx address: 对一个地原创 2021-06-18 03:07:38 · 449 阅读 · 1 评论 -
底层探索开篇alloc流程
一、准备阶段1.创建非objc源码工程、iOS - App项目、2.创建HSPerson类、并且声明几个属性@interface HSPerson : NSObject@property (nonatomic,copy)NSString *name;@property (nonatomic,copy)NSString *hobby;@property (nonatomic,assign)int age;@property (nonatomic,assign)BOOL isBoy;原创 2021-06-06 18:40:16 · 452 阅读 · 0 评论 -
objc4-818.2编译踩坑总结篇
关于objc4源码的编译、以后还会出新版、如果自己想最先常鲜、需要自己玩一遍、以后自己就学到手咯。“内容不重要 分析思维探索的角度”很重要!!!圈住了!1、关于objc4源码问题可在Github处下载编译完成的源码2、手动体验源码编译过程苹果原版源码下载地址、macOS 11.3系统下的objc4-824未下载下来、获取11.2系统下的 objc4-818.2版本3、源码需要的部分系统文件源码获取下来后将面临一系列各个系统库获取的头文件缺失的报错问题、根据750、781等版本编译问题.原创 2021-06-06 12:26:08 · 980 阅读 · 0 评论