Skip to content

Latest commit

 

History

History
77 lines (51 loc) · 3.12 KB

11.2 低层级类型概览 AnOverviewofLow-LevelTypes.md

File metadata and controls

77 lines (51 loc) · 3.12 KB

第十一章:互用性 Interoperability

11.2 低层级类型概览 AnOverviewofLow-LevelTypes

一开始看到低层级类型的时候一脸懵逼。。这个是啥意思,我们这里可以理解成偏底层的类型(个人观点,如有出入谢谢指正。thanks.)

在swift标准库中有不少类型提供了低层方式来访问内存。
和底层相关的api或者命名中我们可以通过其命名方式就可以知道大概作用。

· 含有managed的类型: 内存是自动管理的。编译器为你申请,初始化并且释放内存。

· 含有unsafe的类型: 不提供自动的内存管理(这个managed正好相反)。你需要明确地进行内存申请,初始化,销毁和回收。

· 含有buffer类型: 表示作用于一连串的多个元素,而非一个单独的元素上,它也提供了 Collection 的接口。

· 含有raw类型: 包含无类型的原始数据,它和C的void*是等价的。在类型名字中不包含raw 的类型的数据是具有类型的。

· 含有mutable类型: 允许它指向的内存发生改变。

指针

这小段的内容偏C语言,C语言大佬可以微微一笑跳过本小段hhh😄

除了OpaquePointerType之外,swift 中还有另外八种指针类型,都用来映射 C 中不同的指针。

这里推荐瞄神关于swift中指针的文章《Swift 中的指针使用》

知识点1:

C 中

const int* (一个指向不可变数据的可变指针)   等效于swift中的UnsafePointer

int* const (一个不可变指针,或者 说,你不能改变这个指针指向的位置) 
两者是不一样的
知识点2:

在任意类型正确的可变变量前面加上 & 符号,可以将它们转变 in-out 表达式:

var x = 5 
func fetch(p: UnsafePointer<Int>) -> Int {
    return p.pointee 
}

fetch(p: &x) // 5

有印象的同学是不是想到函数章讲到的in-out表达式6.4 inout参数和可变方法 忘却的同学赶紧回去再补补🐶

知识点3:

Swift 中申请内存的方式,其实和C中是很像的。 1.先申请内存。 2.初始化。 3.使用。 4.不用就释放。

直接上demo~

// 申请两个 Int 的内存,并初始化它们
let z = UnsafeMutablePointer<Int>.allocate(capacity: 2) z.initialize(to: 42, count: 2)
z.pointee // 42
//指针计算:
(z+1).pointee = 43
//下标:
z[1] // 43
//销毁内存
// 如果被指的是⼀一个⾮非平凡值 (⽐比如类实例例),那么你需要 // 在调⽤用 deallocate 之前先 deinitialize z.deallocate(capacity: 2)
// 不不要在 deallocate 之后在访问被指向的值

在申请内存后,你必须对其进行初始化,之后 才能使用它。一旦你不再需要这个指针,你需要释放内存。

over~