继续创作,加速生长!这是我参与「日新计划 6 月更文应战」的第23天,点击检查活动概况


  1. Swift Optional
  2. Swift Enum
  3. iOS开发 做一个三角形
  4. Swfit 指针类型
  5. Swift 特点(下)
  6. Swift 特点
  7. Swift 小结
  8. Swift 类与结构体(下)
  9. Swift 类的生命周期
  10. Swift 类的初始化器
  11. Swift 类与结构体
  12. OpenGL 紧缩纹路
  13. OpenGL 地道坐标核算
  14. 0penGL 像素格局及数据类型
  15. OpenGL 纹理目标
  16. OpenGL 纹路
  17. OpenGL 模型改变
  18. OpenGL 视图
  19. OpenGL 矩阵
  20. OpenGL 向量
  21. OpenGL 颜色混合
  22. OpenGL 深度测验的潜在危险
  23. OpenGL 浅析深度测验
  24. OpenGL 浅析隐藏面消除
  25. OpenGL 图元连接方式
  26. 记WKWebView与HTML完结交互两三事
  27. OpenGL 渲染流程图解析
  28. OpenGL 控制你的正方形
  29. OpenGL 专业名词解释
  30. OpenGL 环境建立 – MacOS

上一篇,咱们探讨了类的生命周期的内容点,今日,咱们一同来看一下 Swift 中 类与结构体的 下半节内容。

异变办法

上上一节咱们了解到,Swift 中 class 和 struct 都能界说办法。但是有一点差异的是默认状况 下,值类型特点不能被自身的实例办法修正。

struct Point {
    var x = 0.0, 
    y = 0.0
    func moveBy(x deltaX: Double, y deltaY: Double) {
        //self
        x += deltaX 
        y += deltaY
    } 
}

经过 SIL 来比照一下,不增加 mutating 访问和增加 mutating 两者有什么实质的差异

struct Point {
    var x = 0.0
    y = 0.0
    func test(){
        let tmp = self.x
    }
    mutating func moveBy(x deltaX: Double, y deltaY: Double) { x += deltaX
        y += deltaY 
    }
}
sil hidden [ossa] @$s4main5PointV4testyyF : $@convention(method) (Point) ->
debug_value %0 : $Point, let, name "self", argno 1 // id: %1
sil hidden [ossa] @$s4main5PointV6moveBy1x1yySd_SdtF : $@convention(method)
@inout Point
debug_value_addr %2 : $*Point, var, name "self", argno 3 // id: %5
let self = Point
var self = &Point

SIL 文档的解释
An @inout parameter is indirect. The address must be of an initialized object.(当前参数 类型是间接的,传递的是已经初始化过的地址)

异变办法的实质:对于变异办法, 传入的 self 被标记为 inout 参数。无论在 mutating 办法 内部产生什么,都会影响外部依赖类型的全部。

输入输出参数:假如咱们想函数能够修正一个形式参数的值,而且期望这些改变在函数结束之后 仍然生效,那么就需求将形式参数界说为 输入输出形式参数 。在形式参数界说开端的时候在前边 增加一个 inout关键字能够界说一个输入输出形式参数

办法调度

objc_mgsend

咱们先来看一下 Swift 中的办法调度

class LGTeacher{
    func teach(){
        print("teach") 
    }
}
var t = LGTeacher()
t.teach()

teach函数的调用进程:找到 Metadata 基于函数表的调度,确定函数地址(metadata + 偏移量), 执行函数之前咱们在第一节课讲到了 Metdata 的数据结构,那么 V-Table 是存放在什么地方那? 咱们先来回顾一下当前的数据结构。

struct Metadata{
    var kind: Int
    var superClass: Any.Type
    var cacheData: (Int, Int)
    var data: Int var classFlags: Int32
    var instanceAddressPoint: UInt32
    var instanceSize: UInt32
    var instanceAlignmentMask: UInt16
    var reserved: UInt16
    var classSize: UInt32
    var classAddressPoint: UInt32
    var typeDescriptor: UnsafeMutableRawPointer
    var iVarDestroyer: UnsafeRawPointer
}

这里咱们有一个东⻄需求重视 typeDescriptor ,不管是 Class , Struct , Enum 都有自己 的 Descriptor ,就是对类的一个详细描述。

struct TargetClassDescriptor{
    var flags: UInt32
    var parent: UInt32
    var name: Int32
    var accessFunctionPointer: Int32
    var fieldDescriptor: Int32
    var superClassType: Int32
    var metadataNegativeSizeInWords: UInt32 
    var metadataPositiveSizeInWords: UInt32 
    var numImmediateMembers: UInt32
    var numFields: UInt32
    var fieldOffsetVectorOffset: UInt32 var Offset: UInt32
    var size: UInt32
    //V-Table
}