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