swift 一些底层笔记

block的一些原理

不包含局部变量和包含全局变量

当闭包內未包含局部变量时,其实跟函数一致,方法调用也是跟函数似的,拿到函数地址直接调用,函数存在于代码段。当闭包只包含全局变量状况也相似,能够直接调用。数组

包含局部变量

以只含一个局部变量为例:数据结构

当闭包包含局部变量时,须要在内存开辟一段堆空间。会申请24个字节,因内存对齐实际开辟32个字节。堆空间布局和类很是相似。前8个字节存放函数地址,(中间8个字节存放引用计数),后8个字节存放copy局部变量的值。闭包

当调用闭包时,会取前8个字节也就是函数地址进行调用,这时内部默认会追加传入一个参数给函数(即闭包的地址)。当函数使用到局部变量时就会以闭包地址加上16个字节(即copy的局部变量值)来进行使用。使用完毕再去更新堆上的变量值。函数

字符串

数组

String, Array 定义和行为上是值类型,底层数据结构更接近引用类型。布局

结构体

结构体数据直接放在结构体内存里面。cdn

枚举

枚举关联值直接保存在内存中,case在内存中只占用一个字节,取rawValue时相似于方法调用,值不保存在枚举对象中。对象

.self .type

class.self 指向类信息,和一个类实例对象前8个字节指向相同 class.type .self的类型 类的类型blog