![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
swift探索
文章平均质量分 90
主要是研究swift的基本概念以及初步的底层实现
changcongcong_ios
这个作者很懒,什么都没留下…
展开
-
Swift探索11:协议Protocol
本文主要分析protocol的用法及底层存储结构协议的基本用法 【语法格式】:协议的语法格式 //协议的语法格式protocol MyProtocol { //body} class、struct、enum都可以遵守协议,如果需要遵守多个协议,可以使用逗号分隔 //1-2、class、struct、enum都可以遵守协议,如果需要遵守多个协议,可以使用逗号分隔struct CJLTeacher: Protocol1, Protocol2 { //body原创 2021-12-13 17:00:42 · 321 阅读 · 0 评论 -
Swift探索10:Optional&Equatable&Comparable&访问控制权限
本文主要分析Optional源码、Equatable+Comparable协议Optional分析swift中的可选类型(Optional),用于处理值缺失的情况,有以下两种情况 有值,且等于x 没有值 这点可以通过swift-source->Optional.swift源码(CMD+P,搜索Optional)源码来印证@frozenpublic enum Optional<Wrapped>: ExpressibleByNilLiteral {原创 2021-12-09 16:38:45 · 2215 阅读 · 0 评论 -
Swift探索9:逃逸闭包 & 非逃逸闭包
本文主要分析逃逸闭包 、非逃逸闭包、自动闭包逃逸闭包 & 非逃逸闭包逃逸闭包定义当闭包作为一个实际参数传递给一个函数时,并且是在函数返回之后调用,我们就说这个闭包逃逸了。当声明一个接受闭包作为形式参数的函数时,可以在形式参数前写@escaping来明确闭包是允许逃逸的 如果用@escaping修饰闭包后,我们必须显示的在闭包中使用self swift3.0之后,系统默认闭包参数就是被@nonescaping,可以通过SIL来验证 SIL验证 1、执行时原创 2021-12-09 16:31:22 · 1039 阅读 · 0 评论 -
Swift探索8:闭包的使用&捕获原理
本文主要分析闭包以及闭包捕获变量的原理闭包闭包是一个捕获了全局上下文的常量或者变量的函数,通俗来讲,闭包可以是常量也可以是函数 【全局函数是一种特殊的闭包】:定义一个全局函数,只是当前的全局函数并不捕获值 func test(){ print("test")} 【函数闭包】:下面的函数是一个闭包,函数中的incrementer是一个内嵌函数,可以从makeIncrementer中捕获变量runningTotal func makeIncrementer() -&g原创 2021-12-08 17:18:32 · 1052 阅读 · 0 评论 -
iOS 底层原理 + Swift 文章汇总
1、对象底层:结构体+alloc分析iOS-底层原理 02:alloc & init & new 源码分析iOS-底层原理 03:objc4-781 源码编译 & 调试iOS-底层原理 04:NSObject的alloc 源码分析iOS-底层原理 05:内存对齐原理iOS-底层原理 06:malloc 源码分析 思路 2、对象的本质:isa+isa属性分析+类结构iOS-底层原理 07:isa与类关联的原理iOS-底层原理 08:类 & 类结构分析iOS-底层原..原创 2021-09-27 16:00:06 · 1839 阅读 · 2 评论 -
Swift探索7:Mirror源码解析
本文主要是分析Mirror的底层实现,以及根据Mirror底层原理仿写其结构的实现在Swift-进阶 06:反射Mirror & 错误处理文章中,我们介绍了Mirror的使用,即JSON解析,对此我们有如下一些疑问: 1、系统是如何通过Mirror获取对应的属性以及值的? 2、Swift众所周知是一门静态语言,系统在底层到底做了什么,使swift具有了反射的特性呢? 下面我们来对Mirror的底层实现进行探索Mirror底层源码分析反射的API主要是由两部分实现的原创 2021-12-07 16:18:17 · 287 阅读 · 0 评论 -
Swift探索6:错误处理&反射Mirror
本文主要介绍Mirror的使用以及使用Mirror进行JSON解析的错误处理反射Mirror反射:是指可以动态获取类型、成员信息,在运行时可以调用方法、属性等行为的特性, 在上面的分析中,我们已经知道,对于一个纯swift类来说,并不支持直接像OC runtime那样的操作 但是swift标准库依旧提供了反射机制,用来访问成员信息,即Mirror 一般使用class CJLTeacher: NSObject { var age: Int = 18}let mir原创 2021-12-06 17:18:15 · 175 阅读 · 0 评论 -
swift探索5:内存管理 & Runtime
本文主要介绍swift中的内存管理,涉及引用计数、弱引用、强引用、循环引用、Runtime等内存管理 - 强引用在swift中也是使用ARC来追踪和管理内存的,下面我们通过一个案例来进行分析class CJLTeacher { var age: Int = 18 var name: String = "CJL"}var t = CJLTeacher()var t1 = tvar t2 = t 查看t的内存情况,为什么其中的refCounts是0x00000006原创 2021-12-03 16:27:05 · 289 阅读 · 0 评论 -
swift探索3: 内存分区&值类型&引用类型
值类型前提:需要了解内存五大区,内存五大区可以参考这篇文章iOS-底层原理 24:内存五大区,如下所示值类型-1 栈区的地址 比 堆区的地址 大 栈是从高地址->低地址,向下延伸,由系统自动管理,是一片连续的内存空间 堆是从低地址->高地址,向上延伸,由程序员管理,堆空间结构类似于链表,是不连续的 日常开发中的溢出是指堆栈溢出,可以理解为栈区与堆区边界碰撞的情况 全局区、常量区都存储在Mach-O中的__TEXT cString段 我原创 2021-09-01 17:04:01 · 369 阅读 · 1 评论 -
swift探索1:类、对象
为了探索swift类的本质,我们创建一个类并将文件编译,生成可读的SIL文件aclass Person { var name = "dotry" var age = 26}let p = Person()编译之后得到解析过程如下@main标识当前man.swift的入口函数,SIL中的 标识符名称以@作为前缀。 %0,%1……在SIL中也叫做寄存器,可以理解为平时代码中定义的常量,一旦赋值之后就不可以改变。如果SIL中还要继续使用,只有不断地累加数字。同时这里的寄存.原创 2021-08-25 14:20:47 · 427 阅读 · 1 评论 -
swift探索4: 方法调度
结构体和类的方法存储在哪里?下面来一一进行分析静态派发值类型对象的函数的调用方式是静态调用,即直接地址调用,调用函数指针,这个函数指针在编译、链接完成后就已经确定了,存放在代码段,而结构体内部并不存放方法。因此可以直接通过地址直接调用 结构体函数调试如下所示 打开打开demo的Mach-O可执行文件,其中的__text段,就是所谓的代码段,需要执行的汇编指令都在这里 对于上面的分析,还有个疑问:直接地址调用后面是符号,这个符号哪里来的?是从Mach-O文件中原创 2021-09-01 17:03:19 · 432 阅读 · 0 评论 -
swift探索2: swift属性
在swift中,属性主要分为以下几种 存储属性 计算属性 延迟存储属性 类型属性 存储属性存储属性,又分两种: 要么是常量存储属性,即let修饰 要么是变量存储属性,即var修饰 定义如下代码class CJLTeacher{ var age: Int = 18 var name: String = "CJL"}let t = CJLTeacher()其中代码中的age、name来说,都是变量存储属性,这一点可原创 2021-09-01 15:18:23 · 203 阅读 · 0 评论