Swift. 方法调度&指针

699 阅读2分钟

方法调度

类中声明的方法是通过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临时更改内存绑定类型