最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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調(diào)用Objective-C編寫(xiě)的API實(shí)例

    Swift調(diào)用Objective-C編寫(xiě)的API實(shí)例

    這篇文章主要介紹了Swift調(diào)用Objective-C編寫(xiě)的API實(shí)例,介紹的比較全面和詳細(xì),對(duì)Objective-C代碼的重復(fù)利用有極大好處,的朋友可以參考下
    2014-07-07
  • Swift編程中的初始化與反初始化完全講解

    Swift編程中的初始化與反初始化完全講解

    這篇文章主要介紹了Swift編程中的初始化與反初始化完全講解,是Swift入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-11-11
  • Swift使用SnapKit模仿Kingfisher第三方擴(kuò)展優(yōu)化

    Swift使用SnapKit模仿Kingfisher第三方擴(kuò)展優(yōu)化

    這篇文章主要為大家介紹了Swift?SnapKit模仿Kingfisher第三方擴(kuò)展優(yōu)化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • swift 字符串String的使用方法

    swift 字符串String的使用方法

    這篇文章主要介紹了swift 字符串String的使用方法的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Swift中的指針操作和使用詳細(xì)介紹

    Swift中的指針操作和使用詳細(xì)介紹

    這篇文章主要介紹了Swift中的指針操作和使用詳細(xì)介紹,Apple期望在Swift中指針能夠盡量減少登場(chǎng)幾率,因此在Swift中指針被映射為了一個(gè)泛型類型,并且還比較抽象,本文詳細(xì)講解了Swift中指針的相關(guān)知識(shí),需要的朋友可以參考下
    2015-01-01
  • Swift利用AFN實(shí)現(xiàn)封裝網(wǎng)絡(luò)請(qǐng)求詳解

    Swift利用AFN實(shí)現(xiàn)封裝網(wǎng)絡(luò)請(qǐng)求詳解

    網(wǎng)絡(luò)請(qǐng)求工具是我們經(jīng)常用到的工具類,所以下面這篇文章主要給大家介紹了關(guān)于Swift利用AFN如何實(shí)現(xiàn)封裝網(wǎng)絡(luò)請(qǐng)求的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • 利用Swift實(shí)現(xiàn)各類的CATransition動(dòng)畫(huà)詳解

    利用Swift實(shí)現(xiàn)各類的CATransition動(dòng)畫(huà)詳解

    CATransition動(dòng)畫(huà)主要在過(guò)渡時(shí)使用,比如兩個(gè)頁(yè)面層級(jí)改變的時(shí)候添加一個(gè)轉(zhuǎn)場(chǎng)效果。CATransition分為兩類,一類是公開(kāi)的動(dòng)畫(huà)效果,一類是非公開(kāi)的動(dòng)畫(huà)效果。這篇文章主要給大家介紹了關(guān)于如何利用Swift實(shí)現(xiàn)各類CATransition動(dòng)畫(huà)的相關(guān)資料,需要的朋友可以參考下。
    2017-09-09
  • Swift利用CoreData實(shí)現(xiàn)一個(gè)通訊錄存儲(chǔ)詳解

    Swift利用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-12
  • swift中defer幾個(gè)簡(jiǎn)單的使用場(chǎng)景詳解

    swift中defer幾個(gè)簡(jiǎn)單的使用場(chǎng)景詳解

    在Swift 2.0中,Apple提供了defer關(guān)鍵字,讓我們可以實(shí)現(xiàn)同樣的效果,這篇文章主要介紹了關(guān)于swift中defer幾個(gè)簡(jiǎn)單的使用場(chǎng)景的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用defer具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧。
    2018-03-03
  • Swift語(yǔ)言實(shí)現(xiàn)地圖坐標(biāo)彈跳動(dòng)畫(huà)

    Swift語(yǔ)言實(shí)現(xiàn)地圖坐標(biāo)彈跳動(dòng)畫(huà)

    這篇文章主要介紹了用Swift語(yǔ)言實(shí)現(xiàn)地圖坐標(biāo)彈跳動(dòng)畫(huà)的方法主要應(yīng)用iOS7來(lái)實(shí)現(xiàn)此功能,需要的朋友可以參考下
    2015-07-07

最新評(píng)論

专栏| 宣恩县| 榆林市| 岫岩| 宣汉县| 扎赉特旗| 安图县| 玛沁县| 和平县| 东平县| 姚安县| 新干县| 聂拉木县| 清远市| 阜南县| 东源县| 皮山县| 上饶县| 宁乡县| 昭通市| 佛坪县| 大化| 易门县| 定安县| 肥西县| 南雄市| 泸水县| 东乡| 宽甸| 大竹县| 阜宁县| 阿坝| 永春县| 瓦房店市| 桦南县| 库尔勒市| 巴塘县| 手机| 奈曼旗| 阳高县| 邹平县|