網(wǎng)站首頁 編程語言 正文
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))
}
結果
30
40
assumingMemoryBound的意義在于:
有時候不想做指針類型轉(zhuǎn)換來增加代碼的復雜度
就可以調(diào)用 此api繞過編譯器檢查,但是并沒有發(fā)生實際的指針轉(zhuǎn)換
內(nèi)存轉(zhuǎn)換 - bindMemory
實際發(fā)生了轉(zhuǎn)換,改變當前內(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))
}
結果
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)
})
結果
0x000000000000001e
withMemoryRebound意義在于:
臨時改變內(nèi)存綁定,出了api 尾隨閉包作用域之后,綁定就不存在了
最后,補充一個小tip
也許你會對swift 閉包 函數(shù)的語法形式感覺會不習慣,編譯器也會自動直接轉(zhuǎn)變?yōu)楹瘮?shù)體
其實高級語言語法習慣僅僅就是一種語法而已
底層其實是函數(shù)棧的形式
一個函數(shù) 包括 函數(shù)名(也就是方法指針),多個參數(shù),函數(shù)體(包含多個變量與調(diào)用)
內(nèi)存表達函數(shù)的方式就是棧的形式:
入棧順序: 函數(shù)指針,參數(shù)順序入棧,函數(shù)體內(nèi)部逐行順序入棧
按照這個邏輯,最后一個尾隨閉包參數(shù)就可以直接變?yōu)楹瘮?shù)體,這樣并不影響函數(shù)棧的入棧方式
原文鏈接:https://juejin.cn/post/7168942846194483207
相關推薦
- 2022-11-01 Python如何使用qrcode生成指定內(nèi)容的二維碼并在GUI界面顯示_python
- 2022-01-29 寶塔部署Yii框架多個商城項目,隊列問題“服務測試失敗,請檢查服務是否正常運行”
- 2022-06-06 Docker容器化應用與結構_docker
- 2022-03-10 .NET6一些常用組件的配置及使用_基礎應用
- 2022-03-19 K8S中五種控制器的介紹以及使用_云其它
- 2022-08-04 python中可以發(fā)生異常自動重試庫retrying_python
- 2022-08-28 redis 主從同步部署
- 2022-12-04 Android多功能視頻播放器GSYVideoPlayer開發(fā)流程_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支