╰つ栺尖篴夢ゞ
本人毕业于计算机技术专业,从事iOS高级开发,专注于iOS/MacOS内核/汇编/源码/架构/算法等相关技术的开发学习,同时热爱人工智能、OpenGL/ES、云原生等技术,CSDN博客专家与原力计划作者,华为云云享专家与特约博主,阿里云专家博主,荣获CSDN iOS领域优质创作者、2022年度博客之星移动领域TOP 3、2022年度博客之星TOP 16、AI创想秀邂逅“华为云ModelArts”征文大赛一等奖、CSDN第一届猿创征文优质博文奖,以及多项优秀TOP博文、CSDN开源挑战赛优秀奖等。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Swift之源码编译的环境搭建和编译流程
编译环境版本准备:macOS 10.15.3 Xcode 11.5brew install cmake njniaPython 2.XSwift 源码地址:Apple/Swift编译流程① clone 源码clone 命令: git clone --branch swift-5.2.4-RELEASE https://github.com/apple/swift.git这里我编译的是 swift-5.2.4-RELEASE,因为在编译源码的时候,这是我使用的版本。如果需要编译原创 2020-12-03 19:25:31 · 6840 阅读 · 3 评论 -
Swift之深入解析“对象”的底层原理
Swift 编译简介Swift 的编译环境配置和编译流程,请参考我之前的博客:Swift之源码编译的环境搭建和编译流程;创建一个 YDWTeacher 类,并通过默认的初始化器,创建一个实例对象并赋值给 t,如下: class YDWTeacher { var age: Int = 18 var name: String = "YDW" } let t = YDWTeacher()接下来,要研究的是这个初始化器到底做了一个什么样的操作?因此引入 SIL (Swift i原创 2021-01-05 03:52:57 · 21674 阅读 · 3 评论 -
Swift之深入解析“类”的底层原理
Objective-C 类熟练 OC 的一定对上面这张图不陌生,没错,这就是 Apple 官方的实例对象、类、元类关系图,形象地展示说明了 isa 的指向关系、superclass 的指向关系以及元类之间的继承关系;看过 OC 类的实现原理,可以知道 OC 的类是从 objc_class 继承的,NSObject 是 OC 的类型, objc_object 是 c 的类型;结构体类型 objc_class 继承于 objc_object 类型,其中 objc_object 也是一个结构体,且有一个原创 2021-01-06 03:55:17 · 28363 阅读 · 1 评论 -
Swift之深入解析“属性”的底层原理
一、存储属性(Stored Property)① 什么是存储属性?存储在实例的内存中的属性,只有一份;存储属性可以是变量存储属性(用关键字 var 定义),也可以是常量存储属性(用关键字 let 定义);可以在定义存储属性的时候指定默认值;也可以在构造过程中设置或修改存储属性的值,甚至修改常量存储属性的值;类(class)和结构体(struct)都可以定义存储属性,可以是变量 var 或者常数 let,而枚举(enum)内不能定义存储实例属性;会占用分配实例对象的内存空间。② 存储原创 2021-04-17 18:24:55 · 22728 阅读 · 4 评论 -
Swift之深入解析“指针”的使用和实现
一、指针① 指针类型Swift 中的指针分为两类:typed pointer 指定数据类型指针,即 UnsafePointer,其中 T 表示泛型;raw pointer 未指定数据类型的指针(原生指针) ,即 UnsafeRawPointer。Swift 与 OC 指针对比如下:SwiftOC说明unsafePointerconst T *指针及所指向的内容都不可变unsafeMutablePointerT *指针及其所指向的内存内容均可变u原创 2021-05-16 19:57:32 · 22693 阅读 · 1 评论 -
Swift之深入解析内存管理的底层原理
一、Swift 内存管理① ARC跟 OC 一样,Swift 也是采用基于引用计数的 ARC 内存管理方案(针对堆空间);Swift 的 ARC 中有三种引用:强引用(strong reference):默认情况下,引用都是强引用;弱引用(weak reference):通过 weak 定义弱引用;必须是可选类型的 var,因为实例销毁后,ARC 会自动将弱引用设置为 nil;ARC 自动给弱引用设置 nil 时,不会触发属性观察器;无主引用(unowned reference):原创 2021-06-09 18:08:11 · 33008 阅读 · 5 评论 -
Swift之深入解析反射Mirror与错误处理
一、反射 Mirror 简介反射是指可以动态获取类型、成员信息,同时在运行时(而非编译时)可以动态调用任意方法、属性等行为的特性。在使用 OC 开发时很少强调其反射概念,因为 OC 的 runtime 要比其他语言中的反射强大的多,在 OC 中可以很简单的实现字符串和类型的转换(NSClassFromString()),实现动态方法调用(performSelector: withObject:),动态赋值(KVC)等等。对于纯 Swift 类来说,并不支持像 OC runtime 那样操作,但是 S原创 2021-06-10 20:10:41 · 6746 阅读 · 9 评论 -
Swift之深入解析反射Mirror的底层原理
一、Mirror 的底层分析① 反射 API反射 API 由两部分实现:一部分是通过 Swift 实现,即 ReflectionMirror.swift;一部分是通过 C++ 实现,即 ReflectionMirror.mm;两者之间是通过暴露给 Swift 的 C++ 函数进行通信,即 @_silgen_name 修饰符会通知 Swift 编译器将这个 Swift 函数映射成 C++ 函数的符号;使用 @_silgen_name 关键字声明的方法,实际调用是括号中的方法,例原创 2021-06-12 20:30:42 · 31251 阅读 · 3 评论 -
Swift之深入解析异步函数async/await的使用与运行机制
一、async/await在 WWDC21 中 Swift 盼来了 async/await,作为现代编程语言的标志之一,async/await 可以让我们像编写常规代码一样,轻松地编写异步代码,这样能更直观且更安全地表达我们的思路。async/await 是整个 Swift 结构化并发的基础,从这个 Session 开始,一起来探索 Swift 新的并发框架。二、加载缩略图步骤如下图所示, Session 通过加载缩略图片演示了 async/await 的使用:加载缩略图片分为以下几个步骤原创 2021-07-08 21:16:07 · 31928 阅读 · 1 评论 -
Swift之利用API可用性解决App Extension无法编译
一、问题分析从 Xcode12.5 开始,苹果要求所有的 Extension Target 必须设置 APPLICATION_EXTENSION_API_ONLY 为 true,否则将会导致编译错误“Application extensions and any libraries they link to must be built with the APPLICATION_EXTENSION_API_ONLY build setting set to YES”;但是通常会在主工程和 Extension原创 2021-07-12 19:52:56 · 7665 阅读 · 5 评论 -
Swift之深入解析“泛型”的底层原理
一、泛型简介① Swift 泛型Swift 提供了泛型可以写出灵活且可重用的函数和类型。Swift 标准库是通过泛型代码构建出来的,Swift 的数组和字典类型都是泛型集。泛型可以创建一个 Int 数组,也可创建一个 String 数组,或者甚至于可以是任何其他 Swift 的类型数据数组。如下所示,是一个非泛型函数 exchange 用来交换两个 Int 值: // 定义一个交换两个变量的函数 func swapTwoInts(_ a: inout Int, _ b: inout Int原创 2021-07-14 20:00:06 · 6878 阅读 · 1 评论 -
Swift之深入解析枚举enum的底层原理
一、Swift 枚举枚举简单的说也是一种数据类型,只不过是这种数据类型只包含自定义的特定数据,它是一组有共同特性的数据的集合。Swift 的枚举类似于 Objective C 和 C 的结构,枚举的功能为:它声明在类中,可以通过实例化类来访问它的值。枚举也可以定义构造函数(initializers)来提供一个初始成员值;可以在原始的实现基础上扩展它们的功能。可以遵守协议(protocols)来提供标准的功能。Swift 中使用 enum 关键词来创建枚举,并且把它们的整原创 2021-07-15 19:26:21 · 6376 阅读 · 7 评论 -
Swift之深入解析协议Protocol的底层原理
一、Swift 协议① 概念协议规定了用来实现某一特定功能所必需的方法和属性。任意能够满足协议要求的类型被称为遵循(conform)这个协议。类,结构体或枚举类型都可以遵循协议,并提供具体实现来完成协议定义的方法和功能。② 语法协议的语法格式如下: protocol SomeProtocol { // protocol definition goes here }要使类遵循某个协议,需要在类型名称后加上协议名称,中间以冒号:分隔,作为类型定义的一部分。遵循多个协议时,原创 2021-07-15 21:23:55 · 6627 阅读 · 2 评论 -
Swift之深入解析访问控制权限
一、简介① 概念访问控制可以限定其他源文件或模块中代码代码的访问级别。可以明确地给单个类型(类、结构体、枚举)设置访问级别,也可以给这些类型的属性、函数、初始化方法、基本类型、下标索引等设置访问级别。协议也可以被限定在一定的范围内使用,包括协议里的全局常量、变量和函数。访问控制基于模块与源文件:模块指的是以独立单元构建和发布的 Framework 或 Application。在 Swift 中的一个模块可以使用 import 关键字引入另外一个模块。源文件是单个源码文件,它通常属于原创 2021-07-25 20:44:18 · 22692 阅读 · 1 评论 -
Swift之从SIL深入分析函数的派发机制
一、引言现有如下代码,输出什么结果? protocol Drawing { func render() } extension Drawing { func circle() { print("protocol") } func render() { circle() } } class SVG: Drawing { func circle() { print("class") } } SVG().render() // what's the o原创 2021-08-14 19:29:21 · 7122 阅读 · 2 评论 -
Swift之深入解析可选类型Optional的底层原理
一、Optional 简介Swift 的可选(Optional)类型,用于处理值缺失的情况,可选表示"那儿有一个值,并且它等于 x “或者"那儿没有值”。Swfit 定义后缀 ?作为命名类型 Optional 的简写,换句话说,以下两种声明是相等的: var optionalInteger: Int? var optionalInteger: Optional<Int>在这两种情况下,变量 optionalInteger 都是可选整数类型。注意,在类型和 ?之间没有空格。Op原创 2021-08-17 20:33:05 · 4923 阅读 · 7 评论 -
Swift之深入解析闭包Closures的使用和捕获变量的原理
一、Closures 简介① 什么是闭包?闭包(Closures)是自包含的功能代码块,可以在代码中使用或者用来作为参数传值。Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的匿名函数比较相似。闭包是一个捕获了全局上下文的常量或者变量的函数,通俗来讲,闭包可以是常量也可以是函数。全局函数和嵌套函数其实就是特殊的闭包。闭包的形式有:全局函数:有名字但不能捕获任何值;嵌套函数:有名字,也能捕获封闭函数内的值;闭包表达式:原创 2021-09-12 20:08:10 · 5210 阅读 · 7 评论 -
Swift之深入解析如何在Swift中实现状态机
一、状态机的定义① 什么是状态机?我们直接使用维基百科上的定义:A finite-state machine (FSM) or finite-state automaton (FSA, plural: automata), finite automaton, or simply a state machine, is a mathematical model of computation.简而言之:通常称作的状态机是有限状态机的简称,它是一种数学计算模型。有限状态机(也就是有限自动机)如果进原创 2021-10-03 23:23:26 · 52411 阅读 · 3 评论 -
Swift之深入解析如何自定义操作符
一、Swift 运算符运算符是一个符号,用于告诉编译器执行一个数学或逻辑运算。Swift 提供了以下几种运算符:算术运算符比较运算符逻辑运算符位运算符赋值运算符区间运算符其它运算符① 算术运算符如下所示,列出了 Swift 语言支持的算术运算符,其中变量 A 为 10,变量 B 为 20:运算符描述实例+加号A + B 结果为 30−减号A − B 结果为 -10*乘号A *原创 2021-10-24 16:20:50 · 38789 阅读 · 8 评论 -
Swift之深入解析如何实现Promise
一、前言异步编程是开发 App 的一个难点,多线程操作,线程的切换,多层嵌套 callback,使得代码十分的混乱,难以理解。func load(_ callback: (Value) -> Void) { loadService.load { result in let saveableItem = result.transfromToSaveableItem saveQueue.async { saveService原创 2021-10-24 20:36:22 · 39560 阅读 · 4 评论 -
Swift之五个让Swift代码更加优雅的扩展
一、自定义下标来安全访问数组在日常开发中,我们至少经历过一次 index-out-of-bounds 的报错,就是数组越界。如下所示,是个数组越界的例子:let values = ["A", "B", "C"]values[0] // Avalues[1] // Bvalues[2] // Cvalues[3] // Fatal error: Index out of range既然是下标超过了数组的大小,那么在取值之前,先检查下标是否超过数组大小。① 通过 if 来判断下标虽原创 2021-11-16 20:38:12 · 4733 阅读 · 0 评论 -
Swift之深入解析如何结合Core Data和SwiftUI
SwiftUI 和 Core Data 之间相差将近十年,SwiftUI 随着 iOS 13 面世,而 Core Data 则是 iPhoneOS 3 的产物;很久以前,它还没有被称为 iOS,因为 iPad 尚未发布。尽管时间相距遥远,Apple 还是投入了大量工作以确保这两种强大的技术能够完美地相互配合使用,这意味着 Core Data 就像始终以这种方式设计一样,已集成到 SwiftUI 中。在此文中,我们将仅使用少量 Core Data 的功能,但是这种功能将很快扩展。如下所示,创建 Xcode.原创 2021-12-12 18:23:05 · 27158 阅读 · 0 评论 -
Swift之深入解析如何将代码添加为自定义LLDB命令
一、前言如果请问最常使用哪个 LLDB 命令?我相信大多数 iOS 开发者都会回答 po。那你是否知道可以使用纯 Swift 代码自定义属于自己的 LLDB 命令呢?本文就来分享如何创建自己的 LLDB 命令,以下是将要分享的内容:添加你的第一个 LLDB 命令;添加带参数的 LLDB 命令;将复杂的 Swift 代码转换为 LLDB 命令。二、添加第一个 LLDB 命令① 了解 LLDB 命令结构为了添加自定义 LLDB 命令,必须利用 command ali原创 2021-12-13 23:45:00 · 853 阅读 · 0 评论 -
Swift之深入分析字典的下标访问方法的源码调试和汇编实现
一、字典的内存布局Swift 中字典具有以下特点:字典由两种范型类型组成,分别是 Key(必须实现 Hashable 协议)和 Value;提供一组 Key 和 Value,可以向字典中插入一条新的数据;如果 Key 已经被插入字典,则可以通过 Key 获取到 Value;可以通过 Key 删除一条字典中的数据;每个 Key 对应,且唯一对应字典中的一个 Value。有很多种方式可以用于存储这些 Key-Value 对,Swift 中字典采用了使用线性原创 2022-01-28 20:20:52 · 15033 阅读 · 0 评论 -
Swift之深入解析类和结构体的本质
一、类和结构体的异同Swift中,类和结构体有许多相似之处,但也有不同。内存分配可以分为堆区(Heap)和栈区(Stack),由于栈区内存是连续的,内存的分配和销毁是通过入栈和出栈操作进行的,速度要高于堆区。堆区存储高级数据类型,在数据初始化时,查找没有使用的内存,销毁时再从内存中清除,所以堆区的数据存储不一定是连续的。类(class)和结构体(struct)在内存分配上是不同的,基本数据类型和结构体默认分配在栈区,而像类这种高级数据类型存储在堆区,且堆区数据存储不是线程安全的,在频繁的数据读写操作时原创 2022-02-12 20:38:11 · 27177 阅读 · 0 评论 -
Swift之深入解析“结果生成器”的工作原理
一、前言结果生成器(以前叫做函数生成器)是 Swift5.4 中引入的一项新 feature,它是 SwiftUI 中支持 ViewBuilder 的技术。随着 Xcode12.5 的发布,苹果正式向开发者开放了它,允许我们为各种用例创建自己的自定义结果生成器。本文讲讲解结果生成器的基本概念、工作原理以及如何使用它来创建自己的自定义结果生成器。二、基本形式作为演示,我们创建一个字符串生成器,并使用 ⭐️ 作为分隔符,例如,给定“Hello”和“World”,字符串生成器将返回一个连接的字符串“原创 2022-05-10 01:00:00 · 36664 阅读 · 0 评论