Swift 3.0 :UnsafePointer

Table of Contents

<a id="1"></a>前言

在用 Swift 進(jìn)行 iOS 開(kāi)發(fā)時(shí)望伦,有時(shí)會(huì)需要調(diào)用一些 C++ 的 API,如:使用 OpenCV 球及。這時(shí)候經(jīng)常需要使用指針照捡,對(duì)內(nèi)存進(jìn)行訪問(wèn)和處理。

Swift 是支持指針的。在 3.0 版本之前佛析,Swift 的指針 API 比較晦澀難懂益老,使用指針 API 時(shí)經(jīng)常是只知其然而不知其所以然。但在 Swift 3.0 里寸莫,這部分內(nèi)容有了重大的改善捺萌,變的更有條理更清晰了。

<a id="2"></a>Unsafe 結(jié)構(gòu)體

在 Swift 3.0 里膘茎,定義了如下有關(guān)指針的結(jié)構(gòu)體:

  • UnsafePointer
  • UnsafeRawPointer
  • UnsafeMutablePointer
  • UnsafeMutableRawPointer
  • UnsafeBufferPointer
  • UnsafeMutableBufferPointer
  • UnsafeBufferPointerIterator

它們都以 Unsafe 開(kāi)頭桃纯,表示使用這些結(jié)構(gòu)體是很不安全的,使用時(shí)要謹(jǐn)慎披坏。對(duì)于上面幾個(gè)結(jié)構(gòu)體态坦,這里做出如下說(shuō)明:

<a id="211"></a>1. Raw

名稱中含有 Raw 的表示指針指向的內(nèi)存并沒(méi)有被分配具體的數(shù)據(jù)類型。名稱中不含 Raw 的表示指針指向的內(nèi)存是有數(shù)據(jù)類型的棒拂。

let ptr = UnsafeMutablePointer<Int>.allocate(capacity: 1)
// 表示 ptr 指向一個(gè)內(nèi)存地址伞梯,從這個(gè)地址開(kāi)始,存放了一個(gè) Int 類型的數(shù)據(jù)着茸。

let rawPtr = UnsafeMutableRawPointer(bitPattern: 0x608000008FD0)
// 表示 rawPtr 指向一個(gè)內(nèi)存地址壮锻,從這個(gè)地址開(kāi)始存放的數(shù)據(jù)類型未知。

UnsafePointer 和 UnsafeRawPointer 的互相轉(zhuǎn)化:

let ptr = UnsafePointer<Int>(bitPattern: 10)
let rawPtr = UnsafeRawPointer(aaa)
let ptrAgain = rawPtr.assumingMemoryBound(to: Int.self)

<a id="212"></a>2. Mutable

名稱中帶有 Mutable 的對(duì)應(yīng) Swift 中的 var 涮阔,不帶 Mutable 的對(duì)應(yīng) let 猜绣,描述的是內(nèi)存中的數(shù)據(jù)是否可變。例子如下:

let a = UnsafeMutablePointer<Int>.allocate(capacity: 1)
a.pointee = 40
a.pointee = 50
print(a.pointee)// 輸出:50\n

let b = UnsafePointer<Int>(bitPattern: 0x608000008FD0)!
b.pointee = 20 // Error: Cannot assign to property:'pointee' is a get-only property

<a id="213"></a>3. Buffer

名稱中含有 Buffer 的是用來(lái)溝通 Swift 的數(shù)組和指針敬特。

let size = 10
let array = UnsafeMutablePointer<Int>.allocate(capacity: size)
for idx in 0..<10 {
    array.advanced(by: idx).pointee = idx
}
let buffer = UnsafeBufferPointer(start: array, count: size)
buffer.forEach({
    print("\($0)" // 輸出 0~9
)})
array.deallocate(capacity: size)

不僅可以用指針訪問(wèn)數(shù)組掰邢,還可以從數(shù)組獲取指針:

let array = [1, 2, 3, 4, 5, 6]
array.withUnsafeBufferPointer({ ptr in
    ptr.forEach({ print("\($0)") }) // 1, 2, 3... 
})

更多的 Unsafe API 請(qǐng)參考官方文檔。

附上我的Github:LinShiwei (Lin Shiwei) · GitHub

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末伟阔,一起剝皮案震驚了整個(gè)濱河市辣之,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌皱炉,老刑警劉巖怀估,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異合搅,居然都是意外死亡多搀,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門灾部,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)康铭,“玉大人,你說(shuō)我怎么就攤上這事赌髓〈犹伲” “怎么了催跪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)夷野。 經(jīng)常有香客問(wèn)我懊蒸,道長(zhǎng),這世上最難降的妖魔是什么悯搔? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任榛鼎,我火速辦了婚禮,結(jié)果婚禮上鳖孤,老公的妹妹穿的比我還像新娘。我一直安慰自己抡笼,他們只是感情好苏揣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著推姻,像睡著了一般平匈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上藏古,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天增炭,我揣著相機(jī)與錄音,去河邊找鬼拧晕。 笑死隙姿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的厂捞。 我是一名探鬼主播输玷,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼靡馁!你這毒婦竟也來(lái)了欲鹏?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤臭墨,失蹤者是張志新(化名)和其女友劉穎赔嚎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體胧弛,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尤误,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叶圃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袄膏。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖掺冠,靈堂內(nèi)的尸體忽然破棺而出沉馆,到底是詐尸還是另有隱情码党,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布斥黑,位于F島的核電站揖盘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏锌奴。R本人自食惡果不足惜兽狭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鹿蜀。 院中可真熱鬧箕慧,春花似錦、人聲如沸茴恰。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)往枣。三九已至伐庭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間分冈,已是汗流浹背圾另。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雕沉,地道東北人集乔。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蘑秽,于是被迫代替她去往敵國(guó)和親饺著。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 就像大多數(shù)現(xiàn)在的變成語(yǔ)言一樣肠牲,在 Swfit 中你就像生活在一個(gè)幸福的世界中幼衰,這里的內(nèi)存被額外的部分所管理,而像這...
    iOS開(kāi)發(fā)攻城獅閱讀 495評(píng)論 0 0
  • 原文鏈接 就像大多數(shù)現(xiàn)在的變成語(yǔ)言一樣缀雳,在 Swfit 中你就像生活在一個(gè)幸福的世界中渡嚣,這里的內(nèi)存被額外的部分所管...
    zkhCreator閱讀 1,137評(píng)論 2 4
  • 最近在學(xué)習(xí)中遇到到 Swift 和 C 第三方庫(kù)交互的問(wèn)題,Google 到了這篇文章順便記錄了下肥印,文章原文出處《...
    淺寒閱讀 1,347評(píng)論 1 1
  • 你要的不是某個(gè)特定的他识椰,而是疼你愛(ài)你,活得燦爛綻放深碱,又能夠給你幸福的男人腹鹉!~紫雨老師 傻笑練習(xí),抬頭仰望天空45度...
    有事多舒緩沒(méi)事多感賞閱讀 273評(píng)論 0 0
  • 有一個(gè)男性朋友曾說(shuō)過(guò)敷硅,“女孩子長(zhǎng)得漂亮做公關(guān)可以加三分功咒。因?yàn)槿绻粋€(gè)男的無(wú)論多生氣愉阎,看到一個(gè)漂亮的女孩,氣也...
    罐子小姐閱讀 322評(píng)論 0 0