![](https://img-blog.csdnimg.cn/c5c5c00cfbd0455f9b67f0468211e210.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Swift高级进阶
文章平均质量分 91
分享以 Swift 实战、SwiftUI、Swift 基础为核心的技术干货,Keep Learning!
╰つ栺尖篴夢ゞ
本人毕业于计算机技术专业,从事iOS高级开发,专注于iOS/MacOS内核/汇编/源码/架构/算法等相关技术的开发学习,同时热爱人工智能、OpenGL/ES、云原生等技术,CSDN博客专家与原力计划作者,华为云云享专家与特约博主,阿里云专家博主,荣获CSDN iOS领域优质创作者、2022年度博客之星移动领域TOP 3、2022年度博客之星TOP 16、AI创想秀邂逅“华为云ModelArts”征文大赛一等奖、CSDN第一届猿创征文优质博文奖,以及多项优秀TOP博文、CSDN开源挑战赛优秀奖等。
展开
-
Swift之属性的使用和实例展示
一、Swift 属性Swift 属性将值跟特定的类、结构或枚举关联。属性可分为存储属性和计算属性:存储属性计算属性存储常量或变量作为实例的一部分计算(而不是存储)一个值用于类和结构体用于类、结构体和枚举存储属性和计算属性通常用于特定类型的实例,属性也可以直接用于类型本身,这种属性称为类型属性。另外,还可以定义属性观察器来监控属性值的变化,以此来触发一个自定义的操作。属性观察器可以添加到自己写的存储属性上,也可以添加到从父类继承的属性上。二、存储属性简单原创 2022-05-09 14:14:19 · 36842 阅读 · 0 评论 -
Swift之函数的语法分析和使用示例
一、函数简介Swift 函数用来完成特定任务的独立的代码块。Swift 使用一个统一的语法来表示简单的 C 语言风格的函数到复杂的 Objective-C 语言风格的方法:函数声明:告诉编译器函数的名字,返回类型及参数。函数定义:提供了函数的实体。Swift 函数包含了参数类型及返回值类型。二、函数定义Swift 定义函数使用关键字 func,定义函数的时候,可以指定一个或多个输入参数和一个返回值类型。每个函数都有一个函数名来描述它的功能,通过函数名以及对应类型的参数值原创 2022-05-09 14:22:42 · 37261 阅读 · 0 评论 -
Swift之扩展的使用和实例展示
一、什么是扩展?扩展就是向一个已有的类、结构体或枚举类型添加新功能,扩展可以对一个类型添加新的功能,但是不能重写已有的功能。Swift 中的扩展可以:添加计算型属性和计算型静态属性;定义实例方法和类型方法;提供新的构造器;定义下标;定义和使用新的嵌套类型;使一个已有类型符合某个协议。扩展声明使用关键字 extension:extension SomeType { // 加到SomeType的新功能写到这里}一个扩展可以扩原创 2022-05-09 14:32:52 · 37011 阅读 · 0 评论 -
Swift之枚举enum的语法和功能
一、前言枚举是为一组相关值定义的一个通用类型,Swift 枚举的功能非常强大,使它比 OC 的枚举应用于更广泛的场景。在本文,我们去了解 enum 的语法和能力。二、枚举语法使用 enum 关键字引入枚举,其整个定义放在一对大括号内:enum CompassPoint { case north case south case east case west}与 C 和 Objective-C 不同,Swift 的枚举成员在创建时不会被赋予一个默认的整型原创 2022-05-09 14:44:52 · 37432 阅读 · 0 评论 -
Swift之深入解析类和结构体的本质
一、类和结构体的异同Swift中,类和结构体有许多相似之处,但也有不同。内存分配可以分为堆区(Heap)和栈区(Stack),由于栈区内存是连续的,内存的分配和销毁是通过入栈和出栈操作进行的,速度要高于堆区。堆区存储高级数据类型,在数据初始化时,查找没有使用的内存,销毁时再从内存中清除,所以堆区的数据存储不一定是连续的。类(class)和结构体(struct)在内存分配上是不同的,基本数据类型和结构体默认分配在栈区,而像类这种高级数据类型存储在堆区,且堆区数据存储不是线程安全的,在频繁的数据读写操作时原创 2022-02-12 20:38:11 · 27006 阅读 · 0 评论 -
Swift之深入解析可选链的功能和使用
一、什么是可选链?可选链(Optional Chaining)是一种可以请求和调用属性、方法和子脚本的过程,用于请求或调用的目标可能为nil。可选链返回两个值:如果目标有值,调用就会成功,返回该值;如果目标为 nil,调用将返回 nil。多次请求或调用可以被链接成一个链,如果任意一个节点为 nil 将导致整条链失效。二、可选链可替代强制解析通过在属性、方法、或下标脚本的可选值后面放一个问号(?),即可定义一个可选链。可选链 ‘?’感叹号(!)强制展开方法,属原创 2022-02-10 19:49:45 · 26892 阅读 · 0 评论 -
Swift之深入解析构造过程和析构过程
一、Swift 构造过程构造过程是为了使用某个类、结构体或枚举类型的实例而进行的准备过程,这个过程包含了为实例中的每个属性设置初始值和为其执行必要的准备和初始化任务。Swift 构造函数使用 init() 方法。与 Objective-C 中的构造器不同,Swift 的构造器无需返回值,它们的主要任务是保证新实例在第一次使用前完成正确的初始化。类实例也可以通过定义析构器(deinitializer)在类实例释放之前执行清理内存的工作。二、存储型属性的初始赋值类和结构体在实例创建时,必须为所有原创 2022-02-03 20:32:16 · 49279 阅读 · 0 评论 -
Swift之深入解析如何进行多重条件排序
一、前言在一个条件或者单个属性上进行排序非常简单, Swift 本身就有相关的功能。如下所示,对 int 数组进行排序的例子:let numbers = [3, 5, 6, 1, 8, 2]let sortedNumbers = numbers.sorted { (lhs, rhs) in return lhs < rhs}// [1, 2, 3, 5, 6, 8]但有时需要根据多个条件或属性来进行排序,那么该怎么处理呢?为了演示这一点,我们可以创建一个结构体来说明。如原创 2021-12-15 13:53:17 · 1491 阅读 · 0 评论 -
Swift之深入解析如何使用Xcode和LLDB v2修改UI元素
一、前言在上一篇博客中,已经详细地介绍如何使用 LLDB 表达式修改 UI 元素,具体请参考:Swift之深入解析如何将代码添加为自定义LLDB命令。在这篇博客中,将继续讨论相同的问题需求,并将重点讨论如何最大限度地利用 LLDB 表达式,如果工具太过复杂,那么它就无法工作并获得用户的采用,出于这个原因,本文将分享一些使 LLDB 表达式更容易使用的替代方法。二、命令别名首先,必须输入(或复制)这个长度的命令(例如 po [[[UIApplication sharedApplication]原创 2021-12-14 20:29:34 · 1835 阅读 · 0 评论 -
Swift之深入解析如何将代码添加为自定义LLDB命令
一、前言如果请问最常使用哪个 LLDB 命令?我相信大多数 iOS 开发者都会回答 po。那你是否知道可以使用纯 Swift 代码自定义属于自己的 LLDB 命令呢?本文就来分享如何创建自己的 LLDB 命令,以下是将要分享的内容:添加你的第一个 LLDB 命令;添加带参数的 LLDB 命令;将复杂的 Swift 代码转换为 LLDB 命令。二、添加第一个 LLDB 命令① 了解 LLDB 命令结构为了添加自定义 LLDB 命令,必须利用 command ali原创 2021-12-13 23:45:00 · 714 阅读 · 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 · 27039 阅读 · 0 评论 -
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 · 4627 阅读 · 0 评论 -
Swift之深入解析基于闭包的类型擦除
与许多其它语言相比,使 Swift 更加安全,更不易出错的原因之一是其先进的(并且在某种程度上是不容忍的)类型系统,这是一种语言功能,有时可能会给人留下深刻的印象,使我们的工作效率提高很多,而有时却令人沮丧。在 Swift 中处理泛型时,可能发生的一种情况,以及通常如何使用基于闭包的类型擦除技术来解决这种情况。假设要编写一个类,可以通过网络加载模型,由于不想为应用程序中的每个模型都复制此类,因此选择使其成为泛型类,如下所示:class ModelLoader<T: Unboxable &am.原创 2021-10-25 18:33:53 · 27190 阅读 · 2 评论 -
Swift之深入解析Key Paths的功能与应用
一、前言自从 Swift 刚开始就被设计为是编译时安全和静态类型后,它就缺少了那种经常在运行时语言中的动态特性,比如 Object-C, Ruby 和 JavaScript。举个例子,在 Objective-C 中,我们可以很轻易的动态去获取一个对象的任意属性和方法,甚至可以在运行时交换它们的实现。虽然缺乏动态性正是 Swift 如此强大的一个重要原因,它帮助我们编写更加可以预测的代码以及更大的保证了代码编写的准确性, 但是有时候,能够编写具有动态特性的代码是非常有用的。值得庆幸的是,Swift 不原创 2021-10-25 18:08:58 · 27769 阅读 · 2 评论 -
Swift之使用KeyPaths创建自定义查询函数
一、前言作为一个相当严格,静态编译的语言,Swift 可能不会在语法自定义方面提供许多渠道,但这实际上确正好相反。通过如何在 Swift 中自定义操作符,Swift 中 KeyPaths 的能力,函数/结果构建器等功能,我们有很多机会为特定用例进行调整 Swift 的语法。当然,无可争议的是,任何类型的语法定制都应小心谨慎地,因为如果不小心,非标准语法也可能很容易成为混乱的源泉。但是,在某些情况下,权衡可能是值得的,并且可以易于制作类似 DSL 这种可以帮助我们使代码更清晰的语法。二、否定布尔值的原创 2022-05-10 02:00:00 · 36592 阅读 · 0 评论 -
Swift之深入解析“结果生成器”的工作原理
一、前言结果生成器(以前叫做函数生成器)是 Swift5.4 中引入的一项新 feature,它是 SwiftUI 中支持 ViewBuilder 的技术。随着 Xcode12.5 的发布,苹果正式向开发者开放了它,允许我们为各种用例创建自己的自定义结果生成器。本文讲讲解结果生成器的基本概念、工作原理以及如何使用它来创建自己的自定义结果生成器。二、基本形式作为演示,我们创建一个字符串生成器,并使用 ⭐️ 作为分隔符,例如,给定“Hello”和“World”,字符串生成器将返回一个连接的字符串“原创 2022-05-10 01:00:00 · 36584 阅读 · 0 评论 -
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 · 39425 阅读 · 4 评论 -
Swift之深入解析如何自定义操作符
一、Swift 运算符运算符是一个符号,用于告诉编译器执行一个数学或逻辑运算。Swift 提供了以下几种运算符:算术运算符比较运算符逻辑运算符位运算符赋值运算符区间运算符其它运算符① 算术运算符如下所示,列出了 Swift 语言支持的算术运算符,其中变量 A 为 10,变量 B 为 20:运算符描述实例+加号A + B 结果为 30−减号A − B 结果为 -10*乘号A *原创 2021-10-24 16:20:50 · 38606 阅读 · 8 评论 -
Swift之Codable自定义解析将任意数据类型解析为想要的类型
一、前言大多数现代应用程序的共同点是,它们需要对各种形式的数据进行编码或解码。无论是通过网络下载的 Json 数据,还是存储在本地的模型的某种形式的序列化表示形式,对于几乎任何 Swift 代码库而言,能够可靠地编码和解码不同的数据都是必不可少的。这就是为什么 Swift 的 Codable API 能成为 Swift 4.0 的新功能一部分时,具有如此重要的重要原因。从那时起,它已发展成为一种标准的,健壮的机制,可以在 Apple 的各种平台中使用编码和解码包括服务器端 Swift。Codable原创 2021-10-24 14:54:56 · 58308 阅读 · 95 评论 -
Swift之深入解析Xcode13对Swift对象生命周期的优化
在 Xcode13 中,在 Build Setting 中,新增 Optimize Object Lifetimes 编译选项,默认是关闭的,Apple 建议将该选项设置为 YES,打开此优化项,可以减小 Swift 对象的生命周期,这样就可以更高效的使用内存。在修改编译器设置为 YES 之前,先了解下 Swift 中的 ARC,需要注意以下几点:对象的生命周期从 init() 开始到最后一次使用结束;在生命周期结束之后,ARC 会将对象 dealloc;ARC 通过引用.原创 2021-11-15 19:39:52 · 2198 阅读 · 0 评论 -
iOS之深入解析静态Pod与动态Pod
一、静态库与动态库在项目中使用 pod 实现模块化,对于子模块和第三类库的导入方式存在两种:静态库、动态库。当在 podfile 中指定 use_frameworks! 时,子模块和第三方类库将被打包成 .framework 动态库,模块之间的代码不能直接引用,需要添加依赖;反之(默认情况)将打包成 .a 静态库:动态库和静态库的区别:资源加载方式;包的大小;编译速度。二、资源加载方式s.dependency 'xx’:静态方式中各模块的 p原创 2021-10-19 20:50:03 · 27774 阅读 · 5 评论 -
iOS之深入解析Hash在iOS中的应用
一、哈希表定义哈希表(hash table,也叫散列表),是根据键(key)直接访问访问在内存储存位置的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度,这个映射函数叫做散列函数,存放记录的数组叫做散列表。给定表 M,存在函数 f(key),对任意给定的关键字值 key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表 M 为哈希(Hash)表,函数f(key)为哈希(Hash)函数。若关键字为 k,则其值存放在 f(k) 的存储位置上,由此不需比较便可直接原创 2021-10-19 19:25:31 · 19975 阅读 · 2 评论 -
iOS之深入解析预乘透明度Premultiplied Alpha
一、前言Premultiplied Alpha 的概念,做过游戏开发的应该都知道,Xcode 的工程选项里有一项 Compress PNG Files,会对 PNG 进行 Premultiplied Alpha,Texture Packer 中也有Premultiplied Alpha 的选项。那么,Premultiplied Alpha 到底是什么呢?在 Alpha Blending: To Pre or Not To Pre 一文中,详情地阐明了 Premultiplied Alpha 的相关解释原创 2021-10-18 18:44:31 · 27238 阅读 · 18 评论 -
Swift之深入解析如何避免单元测试中的强制解析
一、前言强制解析(使用 !)是 Swift 语言中不可或缺的一个重要特点(特别是和 Objective-C 的接口混合使用时),它回避了一些其他问题,使得 Swift 语言变得更加优秀。比如在我的博客 Swift之深入解析如何处理非可选的可选项类型 中,在项目逻辑需要时使用强制解析去处理可选类型,将导致一些离奇的情况和崩溃。因此,尽可能地避免使用强制解析,将有助于搭建更加稳定的应用,并且在发生错误时提供更好的报错信息。那么如果是编写测试时,情况会怎么样呢?安全地处理可选类型和未知类型需要大量的代码,原创 2021-10-10 04:33:00 · 25152 阅读 · 4 评论 -
Swift之深入解析如何处理非可选的可选项类型
一、前言Optional 是 Objective-C 没有的数据类型,是苹果引入到 Swift 语言中的全新类型,它的特点就和它的名字一样:可以有值,也可以没有值,当它没有值时,就是 nil。可选选项 Optional 可以说是 Swift 最重要的特性之一,也是它区别于 Objective-C 等语言的关键,通过被强制处理可能为 nil 的情况,我们倾向于编写更可预测和更少出错的代码。然而,有些时候可选值可能会致我们于尴尬的境地,尤其是作为开发者了解(甚至是有些猜测的成分在),有的特定变量始终是非原创 2021-10-09 22:42:52 · 25192 阅读 · 3 评论 -
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 · 52018 阅读 · 3 评论 -
iOS之深入解析Memory内存
一、前言iOS 是基于 BSD 发展而来,理解一般的桌面操作系统的内存机制是非常有必要的。在此基础之上,进一步在 iOS 系统层面进行分析,包括 iOS 整体的内存机制,以及 iOS 系统运行时的内存占用的情况。最后会将粒度缩小到 iOS 中的单个 App,到单个 App 的内存管理策略。那么:什么是冯·诺依曼结构?什么是冯·诺依曼结构的瓶颈,以及如何突破瓶颈?存储器分哪两类,分别有什么特点?为什么使用缓存能提高效率?什么是物理寻址?什么是虚拟寻址?原创 2021-10-01 22:00:00 · 3677 阅读 · 1 评论 -
Swift之深入解析闭包Closures的使用和捕获变量的原理
一、Closures 简介① 什么是闭包?闭包(Closures)是自包含的功能代码块,可以在代码中使用或者用来作为参数传值。Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的匿名函数比较相似。闭包是一个捕获了全局上下文的常量或者变量的函数,通俗来讲,闭包可以是常量也可以是函数。全局函数和嵌套函数其实就是特殊的闭包。闭包的形式有:全局函数:有名字但不能捕获任何值;嵌套函数:有名字,也能捕获封闭函数内的值;闭包表达式:原创 2021-09-12 20:08:10 · 5048 阅读 · 7 评论 -
iOS之深入解析如何实现isEqual的重写
一、如何重写 hash 方法一个合理的 hash 方法要尽量让 hash 表中的元素均匀分布,来保证较高的查询性能。如果两个对象可以被视为同一个对象,那么它们的 hash 值要一样。这里给出一个普遍的算法(详情请参考:Equality): - (NSUInteger)hash { // 假设对象有三个属性,那么对这三个属性分别算出 hash 值,然后进行异或运算 return [self.property1 hash] ^ [self.property2 hash] ^ [se原创 2021-09-03 23:08:24 · 3585 阅读 · 1 评论 -
iOS之深入解析崩溃Crash的收集调试与符号化分析
一、Crash 类型Crash 一般产生自 iOS 的微内核 Mach,然后在 BSD 层转换成 UNIX SIGABRT 信号,以标准 POSIX 信号的形式提供给用户。NSException 是使用者在处理 App 逻辑时,用编程的方法抛出。iOS 端的 Crash 分为三类:Mach 异常:EXC_CRASH;UNIX 信号:SIGABRT;系统崩溃而引起的程序 NSException 异常退出。二、iOS 中的崩溃类型① EXC_BAD_ACCESS在原创 2021-09-03 03:06:04 · 17374 阅读 · 2 评论 -
iOS之深入解析静态库和动态库
一、库① 什么是库?库就是程序代码的集合,将 N 个文件组织起来,是共享程序代码的一种方式。从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。② 库的分类根据程序代码的开源情况,库可以分为两类:开源库:源代码是公开的,可以看到具体实现,比如知名的第三方框架:AFNetworking、SDWebImage 等。闭源库:不公开源代码,只公开调用的接口,看不到具体的实现,是一个编译后的二进制文件。这种常见于一些公司的 SDK 包,比如高德地图 SDK、环信即时通讯 S原创 2021-08-31 18:23:24 · 10508 阅读 · 1 评论 -
iOS之深入解析事件传递的响应链
一、UIResponderApp 使用响应者对象接收和处理事件,只有继承 UIResponder 的类,才能处理事件。UIApplication、UIView、UIViewController 都是继承自 UIResponder 类,可以响应和处理事件。CALayer 继承自 NSObject,不是 UIResponder 的子类,无法处理事件。响应者接收到原始事件数据,必须处理事件或者转发到另一个响应者对象。当 App 接收到一个事件时,UIKit 自动引导事件到最合适的响应者对象,也叫做第一响应原创 2021-08-30 21:00:08 · 16925 阅读 · 1 评论 -
iOS之深入解析如何构建静态库
一、.a 文件静态库打包① 打开 Xcode 创建一个新的 Static Library 工程,取名 MyStaticLibrary:② 创建工程完毕后,系统自动创建了一个同名类:添加一个方法用于测试: #import <Foundation/Foundation.h> @interface MyStaticLibrary : NSObject + (void)test; @end @implementation MyStaticLibrary原创 2021-08-30 20:32:39 · 16848 阅读 · 1 评论 -
iOS之深入解析如何构建动态库与framework动态更新
一、构建步骤创建一个动态库 MyDynamicFramework:创建一个测试类:在 MyDynamicFramework.h(默认生成,可统一暴露头文件) 中 #import “Person.h”: #import <UIKit/UIKit.h> //! Project version number for MyDynamicFramework. FOUNDATION_EXPORT double MyDynamicFrameworkVersionNumber;原创 2021-08-28 02:16:57 · 23015 阅读 · 1 评论 -
iOS之深入解析App Thinning的应用瘦身优化
当前 iOS App 的编译打包方式是把适配兼容多个设备的执行文件及资源文件合并一个文件,上传和下载的文件则包含了所有的这些文件,导致占用较多的存储空间。App Thinning 是一个关于节省 iOS 设备存储空间的功能,它可以让 App Store 和操作系统在安装、更新及运行 iOS 或者 watchOS 的 App 等场景时,通过一系列的优化,尽可能减少安装包的大小,仅下载所需的资源,减少 App 的占用空间,从而节省设备的存储空间。这个过程包括了三个过程:slicing、bitcode、on-.原创 2021-08-29 19:26:24 · 18337 阅读 · 1 评论 -
iOS之深入解析Xcode编译运行的原理与应用
一、前言一般可以将编程语言分为两种,编译语言和直译式语言。编译语言(Compiled language)是一种编程语言类型,通过编译器来实现。它不像解释型语言一样,由解释器将代码一句一句运行,而是以编译器,先将代码编译为机器代码,再加以运行。理论上,任何编程语言都可以是编译式,或直译式的。它们之间的区别,仅与程序的应用有关。直译语言(Interpreted language),又称直译式语言,是一种编程语言,它不需要经过编译器先行编译为机器码,之后直接在CPU中运行。相对的,编程语言需要原创 2021-08-28 19:31:03 · 11725 阅读 · 17 评论 -
iOS之深入解析操作系统的架构
一、iOS 系统架构层次在 iOS 中,框架是一个目录,包含了共享资源库,用于访问该资源库中储存的代码的头文件,以及图像、声音文件等其它资源。共享资源库定义应用程序可以调用的函数和方法。iOS 为应用程序开发提供了许多可使用的框架,并构成 iOS 操作系统的层次架构,分为四层:Cocoa Touch 可触摸层:这一层为应用程序开发提供了各种有用的框架,并且大部分与用户界面有关,本质上来说它负责用户在 iOS 设备上的触摸交互操作。 包括:Address Book UI Framewor原创 2021-08-28 15:35:10 · 14485 阅读 · 1 评论 -
Swift之深入解析Core Data数据管理的集成指南
一、Core Data 简介① 什么是 Core Data?CoreData 是 iOS SDK 里的一个很强大的框架,允许开发者以面向对象的方式存储和管理数据,使用 CoreData 框架,开发者可以轻松有效地通过面向对象的接口管理数据。CoreData 是一个模型层的技术,可以帮助建立代表程序状态的模型层。CoreData 也是一种持久化技术,能将模型对象的状态持久化到磁盘,但它最重要的特点是:不仅是一个加载和保存数据的框架,还能和内存中的数据很好的共事。在数据操作过程中,Core Data 无原创 2021-08-26 03:43:41 · 10313 阅读 · 14 评论 -
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 · 7013 阅读 · 2 评论 -
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 · 3278 阅读 · 3 评论