[swift 進階]讀書筆記-第十一章:互用性 C11P2 低層級類型概覽 AnOverviewofLow-LevelTypes

第十一章:互用性 Interoperability

11.2 低層級類型概覽 AnOverviewofLow-LevelTypes

一開始看到低層級類型的時候一臉懵逼。。這個是啥意思,咱們這裏能夠理解成偏底層的類型(我的觀點,若有出入謝謝指正。thanks.)git

在swift標準庫中有很多類型提供了低層方式來訪問內存。
和底層相關的api或者命名中咱們能夠經過其命名方式就能夠知道大概做用。

· 含有managed的類型: 內存是自動管理的。編譯器爲你申請,初始化而且釋放內存。github

· 含有unsafe的類型: 不提供自動的內存管理(這個managed正好相反)。你須要明確地進行內存申請,初始化,銷燬和回收。swift

· 含有buffer類型: 表示做用於一連串的多個元素,而非一個單獨的元素上,它也提供了 Collection 的接口。api

· 含有raw類型: 包含無類型的原始數據,它和C的void*是等價的。在類型名字中不包含raw 的類型的數據是具備類型的。函數

· 含有mutable類型: 容許它指向的內存發生改變。fetch

指針

這小段的內容偏C語言,C語言大佬能夠微微一笑跳過本小段hhh😄spa

除了OpaquePointerType以外,swift 中還有另外八種指針類型,都用來映射 C 中不一樣的指針。

這裏推薦瞄神關於swift中指針的文章《Swift 中的指針使用》指針

知識點1:

C 中code

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~

文章源文件地址,你們若是有更好的想法和觀點歡迎交流

相關文章
相關標籤/搜索