Objective-C底层原理
文章平均质量分 94
深入解析Objective-C底层实现原理、核心编程思想、性能优化等iOS底层开发的原理和思想,学习iOS开发中常用的脚本语言,深入理解git操作,探索iOS自动化在项目中的实际应用和Xcode编译流程与编译原理,学习Cocapods原理和如何实现在组件化,以及如何利用它给项目带来更多便捷的工具!!
╰つ栺尖篴夢ゞ
本人毕业于计算机技术专业,从事iOS高级开发,专注于iOS/MacOS内核/汇编/源码/架构/算法等相关技术的开发学习,同时热爱人工智能、OpenGL/ES、云原生等技术,CSDN博客专家与原力计划作者,华为云云享专家与特约博主,阿里云专家博主,荣获CSDN iOS领域优质创作者、2022年度博客之星移动领域TOP 3、2022年度博客之星TOP 16、AI创想秀邂逅“华为云ModelArts”征文大赛一等奖、CSDN第一届猿创征文优质博文奖,以及多项优秀TOP博文、CSDN开源挑战赛优秀奖等。
展开
-
iOS之深入解析alloc、init与new的底层原理
底层探索一、对于iOS的底层原理探索一般有三个方法实现汇编分析LLDB调试源码分析二、作为 iOS 开发者,需要关注的应该就是从应用启动到应用被 kill 掉这一整个生命周期的内容。不妨从最熟悉的 main 函数开始,一般来说,在 main.m 文件中打一个断点,左侧的调用堆栈视图应该如下图所示:三、调用堆栈有两个注意点:需要关闭 Xcode 左侧 Debug 区域最下面的 show only stack frames with debug symbols and between li原创 2020-09-01 23:40:06 · 31351 阅读 · 1 评论 -
iOS之深入解析对象isa的底层原理
一、isa 简介alloc初始化时不仅创建了对象并且分配内存,同时初始化 isa 指针属性。Objective-C 对象在底层本质上是结构体,所有的对象里面都会包含有一个 isa ,isa 的定义是一个联合体 isa_t,isa_t 包含了当前对象指向类的信息。isa 是一个联合体,而这其实是从内存管理层面来设计的,因为联合体是所有成员共享一个内存,联合体内存的大小取决于内部成员内存大小最大的那个元素,对于 isa 指针来说,就不用额外声明很多的属性,直接在内部的 ISA_BITFIELD 保存信息。原创 2020-09-02 12:34:19 · 16678 阅读 · 3 评论 -
iOS之深入解析内存对齐的底层原理
内存对齐简介一、概念① 什么是内存对齐?内存对齐是一种在计算机内存中排列数据(表现为变量的地址)、访问数据(表现为CPU读取数据)的一种方式。内存对齐包含了两种相互独立又相互关联的部分:基本数据对齐和结构体数据对齐 。② 为什么要进行内存对齐?平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次原创 2020-09-08 00:55:20 · 4817 阅读 · 2 评论 -
iOS之深入解析Objective-C和Swift初始化
初始化在 iOS 里面,无论是 Objective-C 还是 Swift,类(结构体、枚举)的初始化都有一定的规则要求,只不过在 Objective-C 中会比较宽松,如果不按照规则也不会报错,但会存在隐患,而在 Swift 则需要严格按照规则要求代码才能编译通过,极大提高了代码的安全性。类(结构体、枚举)的初始化有两种初始化器(初始化方法):指定初始化器(Designated Initializers )、便利初始化器(Convenience Initializers)。一、Designated I原创 2020-09-04 08:46:28 · 22619 阅读 · 2 评论 -
iOS之深入解析缓存方法cache_t底层原理
一、cache_t 原理cache_t:结构体,相当于缓存,缓存的是方法, 它要根据自身结构体所容纳的空间大小来决定其所占字节数。(另外,cache_t是结构体,不是结构体指针。Class为结构体指针,所占字节为8) struct cache_t { struct bucket_t *_buckets; // 8 mask_t _mask; // 4 mask_t _occupied; // 4 }未完待续...原创 2020-09-17 00:55:24 · 30292 阅读 · 1 评论 -
iOS之深入解析类Class的底层原理
内存偏移定义以下数组并打印数组元素地址: int a[4] = {1,2,3,4}; int *b = a; NSLog(@"%p - %p - %p - %p",&a,&a[0],&a[1],&a[2]); NSLog(@"%p - %p - %p",b,b+1,b+2);打印如下: 0x7ffeefbff520 - 0x7ffeefbff520 - 0x7ffeefbff524 - 0x7ffeefbff528 0x7ffeefbff520 -原创 2020-09-12 01:55:10 · 30372 阅读 · 2 评论 -
iOS之深入解析App启动dyld加载流程的底层原理
dyld 简介一、什么是dyld?dyld 是英文 the dynamic link editor 的简写,意为动态链接器,是苹果操作系统的一个重要的组成部分。在 iOS/Mac OSX 系统中,仅有很少量的进程只需要内核就能完成加载,基本上所有的进程都是动态链接的,所以 Mach-O 镜像文件中会有很多对外部的库和符号的引用,但是这些引用并不能直接用,在启动时还必须要通过这些引用进行内容的填补,这个填补工作就是由 动态链接器dyld 来完成的,也就是符号绑定。动态链接器 dyld 在系统中以一个原创 2020-10-13 04:44:31 · 31381 阅读 · 5 评论 -
iOS之深入解析dyld与ObjC关联的底层原理
App启动与dylb加载我们知道 dyld 的加载过程,即在 App 启动启动执行 main 函数之前,dylb 主要作了环境变量配置、共享缓存、主程序的初始化、插入动态库、链接主程序、链接动态库、弱符号绑定、执行初始化方法、寻找主程序入口等一系列处理,具体请参考我之前的博客:iOS之深入解析App启动dyld加载流程的底层原理;在 main 函数执行过程中,当 dyld 加载到开始链接主程序的时候 , 递归调用 recursiveInitialization 函数。recursiveInitial原创 2020-10-22 05:05:44 · 33393 阅读 · 2 评论 -
iOS之深入解析dispatch source的原理与功能
dispatch source 和 runLoop source 都是用来监听事件的,可以创建不同类型的dispatch source和runLoop source。dispatch source 监听到事件产生时,会将 event handler 添加到目标 queue。runLoop source 需要先按照某种模式加入到指定线程的 runLoop 中。dispatch source 和 runLoop source 都是异步处理模式,只要创建、设置好,就可以在相应的 handler 中监听到相应事件的原创 2020-08-31 22:18:10 · 7044 阅读 · 3 评论 -
iOS之深入解析YYImage图片处理的底层原理
YYImage的使用特性支持WebP、APNG、GIF类型动画图像的播放/编码/解码;支持WebP、PNG、GIF、JPEG、JP2、TIFF、BMP、ICO、ICNS类型静态图像的显示/编码/解码;支持PNG、GIF、JPEG、BMP类型图片的渐进式/逐行扫描/隔行扫描解码;支持多张图片构成的帧动画播放,支持单张图片的 sprite sheet 动画;高效的动态内存缓存管理,以保证高性能低内存的动画播放;完全兼容 UIImage 和 UIImageView,使用方便。基本用法显示动原创 2020-07-08 13:26:10 · 17114 阅读 · 3 评论 -
iOS之深入解析AFNetworking的底层原理
这里写目录标题AFNetworking简介一、AFNetworking 版本二、AFNetworking 构成模块解析一、AFURLSessionManager① 创建sessionManager②③整体流程① 创建 NSMutableRequest 对象② 用 NSMutableRequest 对象创建 NSURLSessionDataTask 对象AFNetworking简介一、AFNetworking 版本AFNetworking 是 iOS 最常用的网络框架,虽然系统也有 NSURLSessi原创 2020-09-04 23:40:37 · 8881 阅读 · 3 评论 -
iOS之深入解析YYModel的底层原理
YYModel 的特性、YYModel 的基本结构分析、YYModel 的核心代码(Json转Model、Model转Json)的实现逻辑分析。原创 2022-06-01 20:08:43 · 25640 阅读 · 0 评论 -
iOS之深入解析Runtime的objc_msgSend“快速查找”底层原理
Runtime一、什么是 runtime ?Objective-C 语言将尽可能多的决策从编译时和链接时推迟到运行时。只要有可能,它就动态地做事情,这意味着该语言不仅需要一个编译器,还需要一个运行时系统来执行编译后的代码。运行时系统作为 Objective-C 语言的一种操作系统,它使语言起作用。因为 Objc 是一门动态语言,所以它总是想办法把一些决定工作从编译连接推迟到运行时。也就是说只有编译器是不够的,还需要一个运行时系统 (runtime system) 来执行编译后的代码。这就是 Obje原创 2020-09-20 00:44:08 · 30706 阅读 · 3 评论 -
iOS之深入解析Runtime的objc_msgSend“慢速查找”底层原理
CacheLookup 快速查找objc_msgSend 通过汇编快速查找方法缓存,如果能找到则调用 TailCallCachedImp 直接将方法缓存起来然后进行调用,如果查找不到就跳到 CheckMiss ,然后走慢速查找流程。该文主要分析 objc_msgSend 慢速查找流程。objc_msgSend 的快速查找请参考之前的文章:iOS之深入解析Runtime的objc_msgSend“快速查找”底层原理。__objc_msgSend_uncached 慢速查找CheckMiss 源码原创 2020-09-23 01:26:34 · 33102 阅读 · 3 评论 -
iOS之深入解析objc_msgSend消息转发机制的底层原理
一、抛砖引玉objc_msgSend() 消息发送的过程就是 通过 SEL 查找 IMP 的过程 。objc_msgSend() 是用 汇编语言 实现的,使用汇编实现的优势是:消息发送的过程需要足够的快速,高级语言在执行的时候都是需要翻译成汇编语言,经过编译成被机器识别的 二进制文件 ,使用汇编可以省去这一翻译过程,可以更快速被机器识别;对于消息的发送,存在很多未知的参数,这有很多不确定性,使用 汇编的寄存器 要比 C 或者 C++ 表现好的多。objc_msgSend() 通过汇编原创 2020-10-13 03:06:59 · 33510 阅读 · 3 评论 -
iOS之深入解析数组遍历的底层原理和性能分析
一、OC数组的类体系当我们创建一个 NSArray 对象时,实际上得到的是 NSArray 的子类 __NSArrayI 对象。同样的,创建 NSMutableArray 对象,得到的同样是其子类 __NSArray对象。有趣的是,当我们创建只有一个对象的 NSArray 时,得到的是__NSSingleObjectArrayI 类对象。__NSArrayI 和 __NSArrayM,__NSSingleObjectArrayI 为框架隐藏的类。OC数组的类体系如下:通过 NSArray原创 2021-03-14 15:03:07 · 26263 阅读 · 1 评论 -
iOS之深入解析图片解压缩到渲染的过程与原理
一、图像从文件到显示屏幕过程① 图像显示到屏幕原理通常计算机在显示是CPU与GPU协同合作完成一次渲染。接下来了解一下CPU/GPU等在这样一次渲染过程中,具体的分工是什么?CPU:计算视图frame,图片解码,需要绘制纹理图片通过数据总线交给GPU;GPU:纹理混合,顶点变换与计算,像素点的填充计算,渲染到帧缓冲区;时钟信号:垂直同步信号V-Sync / 水平同步信号H-Sync;iOS设备双缓冲机制:显示系统通常会引入两个帧缓冲区,双缓冲机制。② 图片显示到屏幕上是CPU与GPU的协原创 2020-09-12 10:46:25 · 1546 阅读 · 1 评论 -
iOS之深入解析Block的使用和外部变量捕获
一、前言闭包 = 一个函数「或指向函数的指针」+ 该函数执行的外部的上下文变量「也就是自由变量」; Block是Objective-C对于闭包的实现。其中,Block:可以嵌套定义,定义Block方法和定义函数方法相似;Block 可以定义在方法内部或外部;只有调用Block时候,才会执行其{}体内的代码;本质是对象,使代码高聚合。使用 clang 将 OC 代码转换为 C++ 文件查看block的方法:在命令行输入代码 clang -rewrite-objc 需要编译的OC文件原创 2021-03-16 04:04:08 · 32246 阅读 · 10 评论 -
iOS之深入解析Block的底层原理
这里写目录标题一级目录二级目录三级目录一、block 本质① block 本质探究② block为什么需要调用?③ block是如何获取外界变量的?④ __block的原理二、block 底层源码分析① block 源码位置② block 类型分析③ 内存变化④ 调用三、签名四、block 三次 copy① _Block_copy 源码分析② _Block_object_assign 分析③ 调试验证④ 总结五、_Block_object_dispose 分析六、block 三层 copy 流程如下:一级原创 2021-03-17 20:58:54 · 34833 阅读 · 4 评论 -
iOS之深入解析GCD的底层原理
一、队列① 源码分析在源码中搜索 dispatch_queue_create 关键字,可以在 queue.c 中发现: dispatch_queue_t dispatch_queue_create(const char *label, dispatch_queue_attr_t attr) { return _dispatch_lane_create_with_target(label, attr, DISPATCH_TARGET_QUEUE_DEFAULT, true); }原创 2021-04-05 15:25:26 · 7930 阅读 · 14 评论 -
iOS之深入解析Runtime的Method-Swizzling方法交换的妙用和底层原理
一、method-swizzling 简介method-swizzling 的含义是方法交换,其主要作用是在运行时将一个方法的实现替换成另一个方法的实现,这就是我们常说的iOS黑魔法。在 OC 中就是利用 method-swizzling 实现 AOP,其中 AOP(Aspect Oriented Programming,面向切面编程)是一种编程的思想,区别于OOP(面向对象编程);OOP和AOP都是一种编程的思想OOP编程思想更加倾向于对业务模块的封装,划分出更加清晰的逻辑单元;而AOP是面向原创 2021-04-10 14:06:48 · 7666 阅读 · 1 评论 -
iOS之深入解析保证线程安全的“锁”的使用和性能分析
一、线程安全在平时的开发中经常使用到多线程,在使用多线程的过程中,难免会遇到资源竞争的问题,那么怎么来避免出现这种问题呢?当一个线程访问数据的时候,其他的线程不能对其进行访问,直到该线程访问完毕。简单来讲就是在同一时刻,对同一个数据操作的线程只有一个。只有确保了这样,才能使数据不会被其他线程影响。而线程不安全,则是在同一时刻可以有多个线程对该数据进行访问,从而得不到预期的结果。比如写文件和读文件,当一个线程在写文件的时候,理论上来说,如果这个时候另一个线程来直接读取的话,那么得到的结果可能是无法预料原创 2021-04-11 01:03:04 · 8216 阅读 · 7 评论 -
iOS之深入解析内存分配的五大区
一、栈区(Stack)① 特点栈是系统数据结构,其对应的进程或者线程是唯一的;栈是向低地址扩展的数据结构;栈是一块连续的内存区域,遵循先进后出(FILO)原则;栈的地址空间在 iOS 中是以 0X7 开头;栈区一般在运行时分配。② 存储栈区是由编译器自动分配并释放的;栈区主要用来存储局部变量和函数的参数,例如函数的隐藏参数(id self,SEL _cmd)。③ 优缺点优点:由于栈是由编译器自动分配并释放的,不会产生内存碎片,所以快速高效;缺点:栈的内存大小有限制,数据原创 2021-04-17 21:30:25 · 18297 阅读 · 1 评论 -
iOS之深入解析“锁”的底层原理
一、OSSpinLock(自旋锁)自从 OSSpinLock 出现安全问题,在 iOS10 之后就被 Apple 废弃。自旋锁之所以不安全,是因为获取锁后,线程会一直处于忙等待,造成了任务的优先级反转;其中的忙等待机制可能会造成高优先级任务一直 running 等待,占用时间片,而低优先级的任务无法抢占时间片,会造成一直不能完成,锁未释放的情况;在 OSSpinLock 被弃用后,其替代方案是内部封装 os_unfair_lock,而 os_unfair_lock 在加锁时会处于休眠状态,而不是自旋原创 2021-05-12 01:38:43 · 17911 阅读 · 5 评论 -
iOS之深入解析自动释放池autoreleasepool的底层原理
一、自动释放池 autoreleasepool 机制自动释放池是 OC 中的一种内存自动回收机制,它可以将加入 AutoreleasePool 中的变量 release 的时机延迟。简单来说,就是当创建一个对象,在正常情况下,变量会在超出其作用域的时立即release。如果将对象加入到了自动释放池中,这个对象并不会立即释放,会等到 runloop 休眠,超出 autoreleasepool 作用域{}之后才会被释放。自动释放池 autoreleasepool 其机制如下图所示:autore原创 2021-05-20 18:52:12 · 18434 阅读 · 9 评论 -
iOS之深入解析Runloop的底层原理
一、Runloop 简介① 什么是 Runloop ?RunLoop 是事件接收和分发机制的一个实现,是线程相关的基础框架的一部分,一个 RunLoop 就是一个事件处理的循环,用来不停的调度工作以及处理输入事件。Runloop 不仅仅是一个运行循环(do-while 循环),也是提供了一个入口函数的对象,消息机制处理模式,运行循环从两种不同类型的源接收事件。输入源提供异步事件,通常是来自另一个线程或来自不同应用程序的消息。定时器源提供同步事件,发生在预定时间或重复间隔。两种类型的源都使用特定于原创 2021-05-20 21:12:42 · 18220 阅读 · 9 评论 -
iOS之深入解析内存管理MRC与ARC机制
一、内存管理① 什么是内存管理?当我们编写程序的时候,会声明各种各样的变量,编写各种各样的代码,它们都会占用内存,但是并不是所有的代码和内存都是由我们进行释放。内存分为5个区域:栈、堆、bss段、数据段、代码段。栈:存放的是局部变量,当局部变量的作用域结束的时候就会由系统进行释放局部变量所占用的内存空间;堆:存放的是程序员手动申请的变量,手动申请的变量可以由程序员手动编写代码进行释放;bss段:存放的是为初始化的全局变量和静态变量,当全局变量和静态变量进行初始化的时候系统就会回收他们所占用的原创 2021-05-24 21:10:09 · 28149 阅读 · 9 评论 -
iOS之深入解析内存管理Tagged Pointer的底层原理
一、前言① Tagged Pointer 概念iOS 开发者对“引用计数”这个名词肯定不陌生,引用计数是苹果为了方便开发者管理内存而引入的一个概念。当引用计数为 0 时,对象就会被释放。但是,真的是所有对象都是这样吗?其实,内存管理方案除了常见的 MRC 和 ARC,还有以下三种:Tagged Pointer、Nonpointer_isa、SideTables。在 2013 年 9 月,苹果推出了 iPhone5s,与此同时,iPhone5s 配备了首个采用 64 位架构的 A7 双核处理器,为了原创 2021-05-27 20:55:15 · 17861 阅读 · 3 评论 -
iOS之深入解析内存管理retain与release的底层原理
一、内存管理① 内存管理原理iOS 的每个对象内部都保存了一个与之相关联的整数,称为引用计数器(auto reference count);每当使用 alloc、new 或者 copy 创建一个对象时,对象的引用计数被设置为 1;给对象发送一条 retain 消息(即调用 retain 方法),可以使引用计数 +1;给对象发送一条 release 消息,可以使引用计数 -1;当一个对象的引用计数为 0 时,那么它将被销毁,其占用的内存被系统回收,OC 会自动向对象发送一条 dealloc 消息原创 2021-05-29 18:42:27 · 26110 阅读 · 2 评论 -
iOS之深入解析内存管理的引用计数retainCount的底层原理
一、简介① 引用计数概念OC 在创建对象时,不会直接返回该对象,而是返回一个指向对象的指针。OC 在内存管理上采用了引用计数,它是一个简单而有效管理对象生命周期的方式。在对象内部保存一个用来表示被引用计数的数字,init、new 和 copy 都会让引用计数 +1,调用 release 让引用计数 -1。当计数等于 0 的时候,系统调用 dealloc 方法来销毁对象。引用计数分为自动引用计数(ARC : Automatic Reference Counting)和手动引用计数(MRC : M原创 2021-05-29 20:45:18 · 15753 阅读 · 1 评论 -
iOS之深入解析malloc的底层原理
一、前言iOS 在创建对象的时候,alloc 方法有三个核心部分:cls->instanceSize(计算需要开辟内存的大小),calloc(开辟内存空间),obj->initlnstanceIsa(将 cls 类和 obj 指针关联)。然而 obj = (id)calloc(1, size) 这一段代码所在位置不再是 libObjc4,它定位到了 libmalloc。malloc 的流程实质上是 iOS 对象申请内存空间实际的对齐方式是 8 字节对齐。二、malloc_zone_t原创 2021-05-31 13:25:27 · 15824 阅读 · 1 评论 -
iOS之深入解析类加载的底层原理:类如何加载到内存中
一、App 启动与 dylb 加载App 启动会由 libdyld.dylib 库先于 main 函数调用 start,执行 _dyld_start 方法,然后运用汇编实现调用 dyldbootstrap::start 方法,随后执行到 dyld::_main 方法中;dyld::_main 是 dyld 的入口,内核加载 dyld,然后执行环境变量的配置,检查是否开启共享缓存,主程序的初始化,插入动态库,链接主程序,链接动态库,弱符号绑定,执行初始化方法,寻找程序入口等一系列启动工作;App 启动原创 2021-06-01 18:03:26 · 31474 阅读 · 3 评论 -
iOS之深入解析类加载的底层原理:分类如何加载到类以及分类和类的配合使用
一、分类的本质① Xcode Documentation通过 Xcode 文档搜索,在 Documentation 搜索 Category 关键字:点击 Category ,如下:② 通过 objc 源码搜索 category_t③ 通过 clang在 main 中定义 YDWperson 的分类 DW: @interface YDWPerson (DW) @property (nonatomic, copy) NSString *cate_name; @prop原创 2021-06-03 15:33:29 · 15384 阅读 · 1 评论 -
iOS之深入解析KVC的底层原理和自定义KVC的实现
一、KVC 简介① 定义KVC 是 Key-Value Coding 的简称,中文译义为键值编码。KVC 是指 iOS 的开发中,可以允许开发者通过 Key 名直接访问对象的属性,或者给对象的属性赋值,而不需要调用明确的存取方法。KVC 是由 NSKeyValueCoding 非正式协议启用的一种机制,对象采用该协议来间接访问其属性,即可以通过一个字符串 key 来访问某个属性。这种间接访问机制补充了实例变量及其相关的访问器方法所提供的直接访问。通过 KVC 就可以在运行时动态地访问和修改对象的原创 2021-06-05 18:16:57 · 19679 阅读 · 13 评论 -
iOS之深入解析KVO的底层原理
一、KVO 简介① 概念KVO 全称 Key Value Observing,是苹果提供的一套事件通知机制,允许对象监听另一个对象特定属性的改变,并在改变时接收到事件。由于 KVO 的实现机制,所以对属性才会发生作用,一般继承自 NSObject 的对象都默认支持 KVO。KVO 和 NSNotificationCenter 都是 iOS 中观察者模式的一种实现,区别在于,相对于被观察者和观察者之间的关系,KVO 是一对一的,而 NSNotificationCenter 是一对多的,KVO 对被监原创 2021-06-06 19:52:54 · 18273 阅读 · 27 评论 -
iOS之深入解析weak关键字的底层原理
一、weak 关键字在 iOS 开发过程中,会经常使用到一个修饰词 weak,使用场景大家都比较清晰,避免出现对象之间的强强引用而造成对象不能被正常释放最终导致内存泄露的问题。weak 关键字的作用是弱引用,所引用对象的计数器不会加1,并在引用对象被释放的时候自动被设置为 nil。...原创 2021-06-16 14:04:49 · 16288 阅读 · 5 评论 -
iOS之深入解析内存管理散列表SideTables和弱引用表weak_table的底层原理
一、SideTables 和 weak_table 的关系在 runtime 中,有四个数据结构非常重要,分别是 SideTables,SideTable,weak_table_t 和 weak_entry_t。它们和对象的引用计数以及 weak 引用相关。在 runtime 内存空间中,SideTables 是一个 64 个元素长度 8 个元素长度的 hash 数组,里面存储了 SideTable。SideTables 的 hash 键值就是一个对象 obj 的 address。因此,一个 obj原创 2021-07-09 19:29:14 · 7806 阅读 · 2 评论 -
iOS之深入解析通知NSNotification的底层原理
一、概念① NSNotificationNSNotification 用于描述通知的类,一个 NSNotification 对象就包含了一条通知的信息,NSNotification 对象是不可变的。所以当创建一个通知时通常包含如下属性: @interface NSNotification : NSObject <NSCopying, NSCoding> @property (readonly, copy) NSNotificationName name; @property (原创 2021-07-10 21:31:16 · 7692 阅读 · 5 评论 -
iOS之深入解析野指针检测的原理及实现
一、异常① 概念异常大致可以分为两类:软件异常:主要是来自 kill(),pthread_kill(),iOS 中的 NSException 未捕获,absort 等;硬件异常:硬件的信号始于处理器 trap,是和平台相关的,野指针崩溃大部分是硬件异常。处理异常时,如果 Mach 异常,则 Mach 层捕获;如果 UNIX 信号异常,则 BSD 层获取。iOS 中的 POSIX API 是通过 Mach 之上的 BSD 层实现的,如下图所示:说明:Mach 是一个受原创 2021-07-18 13:45:10 · 6181 阅读 · 6 评论 -
iOS之深入解析CFRunloop的多线程隐患
一、前言如果还不了解 Runloop,请参考我之前的博客:iOS之深入解析Runloop的底层原理。在苹果官方文档中,声明了 CFRunloop 是线程安全的,但是需要注意的是,Apple 使用了generally 这个模糊的词语,如下所示: Thread safety varies depending on which API you are using to manipulate your run loop. The functions in Core Foundation are gener原创 2021-07-27 19:12:02 · 3283 阅读 · 3 评论