Swfit 指针类型

175 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情


  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中 的指针类型:

指针类型

今天,我们来一起探讨下Swift中的指针类型,以及它们的特征:

swift中的指针总共分为两类,typed pointer 指定数据类型指针,raw pointer 未指定数据类型的指针(原生指针)。基本上我们开发过程中能接触到的指针类型有以下几种指针:

image.png

原始指针的使用

我们一起来看一下如何使用 未指定类型的指针(原生指针) Raw Pointer 来存储4个整形的数据,这里我们需要使用的的是UnsafeMutableRawPointer指针, 代码如下: image.png

调试台打印信息如下:然而,当前的内存值不是我们想象中的数值内容 image.png

这里明显是我们对当前数据的存储方式不对,按道理来说我们存储的是8个字节的数据,8个字节的排列开来,而 在这个过程中,存储的好像我们并不知道每个数据与数据之间的间距,所以在此处我们需要指定每个数据之间在内存中的间距。如下: image.png image.png

其中 alignment 就是以当前的结构体中最大的元素的内存大小来作为整个结构体的内存对齐大小,也就是8。同样的 Stride 这里也不难理解,量然当前结构体的大小为 17 字节,但并不是8字节的倍数,这也就意味着,如果我们要在一段连续内存当中存储下一个数据(假设是Int),那么要从那一个位置开始存储啊?是不是就是从 index = 24,这里开始存储 Int 类型呢?

同样的,这里我们如果把当前 LGPerson 结构调换一个顺序,那么这里的大小就变了。 其中 alignment 是不变的,但是 sizestride 都变了。

这里我们回到我们的指针操作,此时我们应该明白在存储 4 个连续整形的数据时候的问题了,那么 就是我们并没有指定当前 Int 数据在排列过程中每个数据和每个数据之间的间隔是多少。

image.png

image.png

当然这里 Swfit 也提供了对应的API 来对齐内存中的数据, 如下所示:

image.png