第十一章:互用性 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~
网友评论