swift指針及內(nèi)存管理內(nèi)存綁定實(shí)例詳解
swift API 綁定
swift提供了3種不同的API來(lái)綁定/重新綁定指針
- assumingMemoryBound(to:)
- bindMemory(to: capacity:)
- withMemoryRebound(to: capacity: body:)
繞過(guò)編譯器檢查 - assumingMemoryBound
就是假定內(nèi)存綁定
func testPointer(_ p: UnsafePointer<Int>) { print(p) } let tuple = (30, 40) withUnsafePointer(to: tuple) { (tuplePtr: UnsafePointer<(Int, Int)>) in testPointer(UnsafeRawPointer(tuplePtr) .assumingMemoryBound(to: Int.self)) }
其實(shí) 兩者本質(zhì)沒(méi)什么區(qū)別,都是指向內(nèi)存的指針
UnsafePointer 指向1塊Int內(nèi)存
UnsafePointer<Int, Int> 指向一個(gè)元組tuple內(nèi)存, 也就是一塊連續(xù)的內(nèi)存,包含連個(gè)連續(xù)的Int
兩者都是首地址
一種方式就是不 強(qiáng)轉(zhuǎn) UnsafePointer<Int, Int> 為 UnsafePointer
- 先把 元組指針轉(zhuǎn)換成原始指針 UnsafeRawPointer(tuplePtr)
- 原始指針調(diào)用 assumingMemoryBound 綁定成Int 指針 UnsafeRawPointer(tuplePtr).assumingMemoryBound(to: Int.self)
func testPointer(_ p: UnsafePointer<Int>) { print(p[0]) print(p[1]) } let tuple = (30, 40) withUnsafePointer(to: tuple) { (tuplePtr: UnsafePointer<(Int, Int)>) in testPointer(UnsafeRawPointer(tuplePtr).assumingMemoryBound(to: Int.self)) }
結(jié)果
30
40
assumingMemoryBound的意義在于:
有時(shí)候不想做指針類型轉(zhuǎn)換來(lái)增加代碼的復(fù)雜度
就可以調(diào)用 此api繞過(guò)編譯器檢查,但是并沒(méi)有發(fā)生實(shí)際的指針轉(zhuǎn)換
內(nèi)存轉(zhuǎn)換 - bindMemory
實(shí)際發(fā)生了轉(zhuǎn)換,改變當(dāng)前內(nèi)存指針綁定的類型
func testPointer(_ p: UnsafePointer<Int>) { print(p[0]) print(p[1]) } let tuple = (30, 40) withUnsafePointer(to: tuple) { (tuplePtr: UnsafePointer<(Int, Int)>) in testPointer(UnsafeRawPointer(tuplePtr) .bindMemory(to: Int.self, capacity: 1)) }
結(jié)果
30
40
bindMemory - 相比于assumingMemoryBound,就是改變內(nèi)存綁定類型
臨時(shí)改變內(nèi)存綁定 - withMemoryRebound
func testPointer(_ p: UnsafePointer<Int8>) { print(p) } let UInt8Ptr = UnsafePointer<UInt8>.init(bitPattern: 30) UInt8Ptr?.withMemoryRebound(to: Int8.self, capacity: 1, { (Int8Ptr: UnsafePointer<Int8>) in testPointer(Int8Ptr) })
結(jié)果
0x000000000000001e
withMemoryRebound意義在于:
臨時(shí)改變內(nèi)存綁定,出了api 尾隨閉包作用域之后,綁定就不存在了
最后,補(bǔ)充一個(gè)小tip
也許你會(huì)對(duì)swift 閉包 函數(shù)的語(yǔ)法形式感覺(jué)會(huì)不習(xí)慣,編譯器也會(huì)自動(dòng)直接轉(zhuǎn)變?yōu)楹瘮?shù)體
其實(shí)高級(jí)語(yǔ)言語(yǔ)法習(xí)慣僅僅就是一種語(yǔ)法而已
底層其實(shí)是函數(shù)棧的形式
一個(gè)函數(shù) 包括 函數(shù)名(也就是方法指針),多個(gè)參數(shù),函數(shù)體(包含多個(gè)變量與調(diào)用)
內(nèi)存表達(dá)函數(shù)的方式就是棧的形式:
入棧順序: 函數(shù)指針,參數(shù)順序入棧,函數(shù)體內(nèi)部逐行順序入棧
按照這個(gè)邏輯,最后一個(gè)尾隨閉包參數(shù)就可以直接變?yōu)楹瘮?shù)體,這樣并不影響函數(shù)棧的入棧方式
以上就是swift指針及內(nèi)存管理內(nèi)存綁定實(shí)例詳解的詳細(xì)內(nèi)容,更多關(guān)于swift指針內(nèi)存管理綁定的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Swift 圖表使用Foudation庫(kù)中測(cè)量類型詳解
這篇文章主要為大家介紹了Swift 圖表使用Foudation庫(kù)中測(cè)量類型詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10Swift利用CoreData實(shí)現(xiàn)一個(gè)通訊錄存儲(chǔ)詳解
這篇文章主要給大家介紹了關(guān)于Swift利用CoreData實(shí)現(xiàn)一個(gè)通訊錄存儲(chǔ)的相關(guān)資料,本文是大家學(xué)習(xí)coreDate的基礎(chǔ)問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12Swift算法之棧和隊(duì)列的實(shí)現(xiàn)方法示例
Swift語(yǔ)言中沒(méi)有內(nèi)設(shè)的棧和隊(duì)列,很多擴(kuò)展庫(kù)中使用Generic Type來(lái)實(shí)現(xiàn)?;蚴顷?duì)列。下面這篇文章就來(lái)給大家詳細(xì)介紹了Swift算法之棧和隊(duì)列的實(shí)現(xiàn)方法,需要的朋友可以參考學(xué)習(xí),下面來(lái)一起看看吧。2017-03-03iOS UITableView展開(kāi)縮放動(dòng)畫(huà)實(shí)例代碼
這篇文章主要介紹了Swift UITableView展開(kāi)縮放動(dòng)畫(huà)實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08倉(cāng)庫(kù)模式及其在Swift?項(xiàng)目中的應(yīng)用詳解
這篇文章主要為大家介紹了倉(cāng)庫(kù)模式及其在Swift?項(xiàng)目中的應(yīng)用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Swift仿選擇電影票的效果并實(shí)現(xiàn)無(wú)限/自動(dòng)輪播的方法
這篇文章主要給大家介紹了關(guān)于Swift仿選擇電影票的效果并實(shí)現(xiàn)無(wú)限/自動(dòng)輪播的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08