欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

swift指針及內(nèi)存管理內(nèi)存綁定實例詳解

 更新時間:2022年11月24日 11:35:01   作者:i_erlich  
這篇文章主要為大家介紹了swift指針及內(nèi)存管理內(nèi)存綁定實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

swift API 綁定

swift提供了3種不同的API來綁定/重新綁定指針

  • assumingMemoryBound(to:)
  • bindMemory(to: capacity:)
  • withMemoryRebound(to: capacity: body:)

繞過編譯器檢查 - 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))
}

其實 兩者本質(zhì)沒什么區(qū)別,都是指向內(nèi)存的指針

UnsafePointer 指向1塊Int內(nèi)存

UnsafePointer<Int, Int> 指向一個元組tuple內(nèi)存, 也就是一塊連續(xù)的內(nèi)存,包含連個連續(xù)的Int

兩者都是首地址

一種方式就是不 強轉(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的意義在于:

有時候不想做指針類型轉(zhuǎn)換來增加代碼的復(fù)雜度

就可以調(diào)用 此api繞過編譯器檢查,但是并沒有發(fā)生實際的指針轉(zhuǎn)換

內(nèi)存轉(zhuǎn)換 - bindMemory

實際發(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)存綁定類型

臨時改變內(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意義在于:

臨時改變內(nèi)存綁定,出了api 尾隨閉包作用域之后,綁定就不存在了

最后,補充一個小tip

也許你會對swift 閉包 函數(shù)的語法形式感覺會不習(xí)慣,編譯器也會自動直接轉(zhuǎn)變?yōu)楹瘮?shù)體

其實高級語言語法習(xí)慣僅僅就是一種語法而已

底層其實是函數(shù)棧的形式

一個函數(shù) 包括 函數(shù)名(也就是方法指針),多個參數(shù),函數(shù)體(包含多個變量與調(diào)用)

內(nèi)存表達(dá)函數(shù)的方式就是棧的形式:

入棧順序: 函數(shù)指針,參數(shù)順序入棧,函數(shù)體內(nèi)部逐行順序入棧

按照這個邏輯,最后一個尾隨閉包參數(shù)就可以直接變?yōu)楹瘮?shù)體,這樣并不影響函數(shù)棧的入棧方式

以上就是swift指針及內(nèi)存管理內(nèi)存綁定實例詳解的詳細(xì)內(nèi)容,更多關(guān)于swift指針內(nèi)存管理綁定的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SwiftUI中TabView組件的常規(guī)使用

    SwiftUI中TabView組件的常規(guī)使用

    這篇文章主要給大家介紹了關(guān)于SwiftUI中TabView組件的常規(guī)使用,文中通過實例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用SwiftUI具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-06-06
  • Swift 圖表使用Foudation庫中測量類型詳解

    Swift 圖表使用Foudation庫中測量類型詳解

    這篇文章主要為大家介紹了Swift 圖表使用Foudation庫中測量類型詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • swift表格控件使用方法詳解(UITableview)

    swift表格控件使用方法詳解(UITableview)

    這篇文章主要為大家詳細(xì)介紹了swift表格控件的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Swift運算符使用方法淺析

    Swift運算符使用方法淺析

    Swift 語言支持大部分標(biāo)準(zhǔn) C 語言的運算符,并且改進(jìn)了許多特性來使我們的代碼更加規(guī)范,其中主要包含算數(shù)運算符、區(qū)間運算符、邏輯運算符、關(guān)系運算符、賦值運算符、自增自減運算符、溢出運算符等
    2022-09-09
  • Swift利用CoreData實現(xiàn)一個通訊錄存儲詳解

    Swift利用CoreData實現(xiàn)一個通訊錄存儲詳解

    這篇文章主要給大家介紹了關(guān)于Swift利用CoreData實現(xiàn)一個通訊錄存儲的相關(guān)資料,本文是大家學(xué)習(xí)coreDate的基礎(chǔ)問題,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • Swift算法之棧和隊列的實現(xiàn)方法示例

    Swift算法之棧和隊列的實現(xiàn)方法示例

    Swift語言中沒有內(nèi)設(shè)的棧和隊列,很多擴展庫中使用Generic Type來實現(xiàn)?;蚴顷犃小O旅孢@篇文章就來給大家詳細(xì)介紹了Swift算法之棧和隊列的實現(xiàn)方法,需要的朋友可以參考學(xué)習(xí),下面來一起看看吧。
    2017-03-03
  • iOS UITableView展開縮放動畫實例代碼

    iOS UITableView展開縮放動畫實例代碼

    這篇文章主要介紹了Swift UITableView展開縮放動畫實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • 倉庫模式及其在Swift?項目中的應(yīng)用詳解

    倉庫模式及其在Swift?項目中的應(yīng)用詳解

    這篇文章主要為大家介紹了倉庫模式及其在Swift?項目中的應(yīng)用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 深入解析Swift語言編程中的可選鏈

    深入解析Swift語言編程中的可選鏈

    這篇文章主要介紹了深入解析Swift語言編程中的可選鏈,是Swift入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-11-11
  • Swift仿選擇電影票的效果并實現(xiàn)無限/自動輪播的方法

    Swift仿選擇電影票的效果并實現(xiàn)無限/自動輪播的方法

    這篇文章主要給大家介紹了關(guān)于Swift仿選擇電影票的效果并實現(xiàn)無限/自動輪播的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08

最新評論