Swift. 方法调度&指针

方法调度

类中声明的方法是通过 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 时需要注意, initializedeinitialize 必须同时出现, deinitialize 中的 countallocate 时的 capacity 需要一致,最后需要手动 deallocate

指针绑定

这里需要注意 advanced 移动的 步长 ,这里是 类型指针 ,已经知道 指针的类型 ,并且知道他的 步长 ,所以不需要 特别指定步长 ,直接写 偏移的步数 就好

实例绑定到结构体

元祖指针转换

结构体属性指针

withMemoryRebound

withMemoryRebound作用域内 ptr是 UInt64 ,出了作用域后p 还是Int

bindMemory 更改内存绑定的类型 之前没绑定,就首次绑定,如果绑定了,重新绑定为新类型
assumingMemoryBound 假定内存绑定 不用检查,已经是指定的类型
withMemoryRebound 临时更改内存绑定类型
稀土掘金
我还没有学会写个人说明!
上一篇

全球首份“实操数据”:以色列证实疫苗显著降低病毒传播

你也可能喜欢

评论已经被关闭。

插入图片