方法调度
类中声明的方法是通过 V-table
来进行调度的 从上图中可以看到终端写入一个 class
运行后进入 initClassVTable
,以 vtable
的里的 元素个数
结束进行循环,获取方法的信息,然后 连续存放到内存
当中
但是通过 extension
添加的方法再去调用他,就变成了 直接调用
查看汇编 调用的是已经确定的 地址
再创建一个Person的子类,查看sil文件 可以看到 extension
中的 方法并没有存放在vtable中
,子类的vtable中也没有继承到,
指针
Swift中的指针分为 指定数据类型指针(type pointer)
, 未指定数据类型指针(raw pointer)也叫做原生指针
指针的 内存管理
是需要 手动管理
的,指针在 使用完
需要 手动释放
原生指针案例
注意:向内存中循环添加数据时,要注意好存入 数据的类型
和 类型的步长
,否则会导致存入 数据混乱错误
类型指针
withUnsafePointer
后面第二个参数是一个 闭包表达式
,通过 rethrows
抛出 result
,so可以简写
let p = withUnsafePointer(to: &age) {$0} 或者 let p = withUnsafePointer(to: &age) { ptr in return ptr } 复制代码
pointee
是获取的指针指向的 值
通过 allocate
创建 UnsafeMutablePointer
时需要注意, initialize
与 deinitialize
必须同时出现, deinitialize
中的 count
与 allocate
时的 capacity
需要一致,最后需要手动 deallocate
指针绑定
这里需要注意 advanced
移动的 步长
,这里是 类型指针
,已经知道 指针的类型
,并且知道他的 步长
,所以不需要 特别指定步长
,直接写 偏移的步数
就好
实例绑定到结构体
元祖指针转换
结构体属性指针
withMemoryRebound
在 withMemoryRebound作用域内
ptr是 UInt64
,出了作用域后p 还是Int
bindMemory | 更改内存绑定的类型 | 之前没绑定,就首次绑定,如果绑定了,重新绑定为新类型 |
assumingMemoryBound | 假定内存绑定 | 不用检查,已经是指定的类型 |
withMemoryRebound | 临时更改内存绑定类型 |