一開始看到低層級類型
的時候一臉懵逼。。這個是啥意思,咱們這裏能夠理解成偏底層的類型
(我的觀點,若有出入謝謝指正。thanks.)git
低層方式
來訪問內存。api
或者命名
中咱們能夠經過其命名方式就能夠知道大概做用。· 含有managed的類型
: 內存是自動管理的。編譯器爲你申請,初始化而且釋放內存。github
· 含有unsafe的類型
: 不提供自動的內存管理(這個managed正好相反)。你須要明確地進行內存申請,初始化,銷燬和回收。swift
· 含有buffer類型
: 表示做用於一連串的多個元素,而非一個單獨的元素上,它也提供了 Collection 的接口。api
· 含有raw類型
: 包含無類型的原始數據,它和C的void*是等價的。在類型名字中不包含raw 的類型的數據是具備類型的。函數
· 含有mutable類型
: 容許它指向的內存發生改變。fetch
這小段的內容偏C語言,C語言大佬能夠微微一笑跳過本小段hhh😄spa
這裏推薦瞄神關於swift中指針的文章《Swift 中的指針使用》指針
C 中code
const int* (一個指向不可變數據的可變指針) 等效於swift中的UnsafePointer
int* const (一個不可變指針,或者 說,你不能改變這個指針指向的位置)
二者是不同的
複製代碼
在任意類型正確的可變變量前面加上 &
符號,能夠將它們轉變 in-out
表達式:接口
var x = 5
func fetch(p: UnsafePointer<Int>) -> Int {
return p.pointee
}
fetch(p: &x) // 5
複製代碼
有印象的同窗是否是想到函數章講到的in-out表達式6.4 inout參數和可變方法 忘卻的同窗趕忙回去再補補🐶
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~