日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Swift 中的指针使用

發布時間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Swift 中的指针使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

SWIFT 中 ?指針被映射為泛型?

UnsafePointer<T>?

UnsafeMutablePointer<T>

表示一組連續數據指針的 UnsafeBufferPointer<T>

表示非完整結構的不透明指針 COpaquePointer 等等

?

UnsafePointer<T>?通過 memory 屬性對其進行取值,如果這個指針是可變的 UnsafeMutablePointer<T> 類型,我們還可以通過 memory 對它進行賦值。

1 2 3 4 5 6 7 func incrementor(ptr: UnsafeMutablePointer<Int>) { ????ptr.memory += 1 } ?? var a = 10 incrementor(&a) a? // 11

swift中&同樣可以取地址, 但無法直接獲取一個指針實例

1 2 3 4 5 6 7 8 9 10 var a = 10 //let ptr:UnsafeMutablePointer<Int> = &a // 'inout Int' is not convertible to 'UnsafeMutablePointer<Int>' //let ptr2 = &a????????????????????????? // 報錯 func incrementor1(inout num: Int) { ????num += 1 } ? var b = 10 incrementor1(&b) b?? // 11
1 2 3 4 5 6 7 [1,2,3] + 1? // 不報錯,Playground顯示一個地址值 ([1,2,3] + 1)[-100]? // 不報錯 ([1,2,3] + 1)[30] ? var array = [1,2,3] //array + 1???? //報錯 ?//let ptr:UnsafeMutableBufferPointer<Int> = array? //報錯

?當使用inout運算符時,使用var聲明的變量和使用let聲明的常量被分別轉換到UnsafePointer和UnsafeMutablePoinger

?

?在 Swift 中不能直接取到現有對象的地址,我們還是可以創建新的 UnsafeMutablePointer 對象。與 Swift 中其他對象的自動內存管理不同,對于指針的管理,是需要我們手動進行內存的申請和釋放的。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 // 將向系統申請 1 個 Int 大小的內存,并返回指向這塊內存的指針 var intPtr = UnsafeMutablePointer<Int>.alloc(1) // 初始化 intPtr.initialize(10) var intPtr2 = intPtr.successor() intPtr2.initialize(50) // 讀取值 intPtr.memory?? // 10 intPtr2.memory?? // 20 ? //intPtr.dealloc(1) //intPtr.destroy(1)// intPtr.destroy() intPtr2 = nil //intPtr2.memory? // 奔潰 ? ? ? var array = [1,2,3] let arrayPtr = UnsafeMutableBufferPointer<Int>(start: &array, count: array.count) // baseAddress 是第一個元素的指針 var basePtr = arrayPtr.baseAddress as UnsafeMutablePointer<Int> ? basePtr.memory // 1 basePtr.memory = 10 basePtr.memory // 10 ? //下一個元素 var nextPtr = basePtr.successor() nextPtr.memory // 2

?直接操作變量地址?withUnsafePointer,withUnsafePointers

1 2 3 4 5 6 7 var test = 10 test = withUnsafeMutablePointer(&test, { (ptr: UnsafeMutablePointer<Int>) -> Int in ????ptr.memory += 1 ????return ptr.memory }) ? test // 11

?

unsafeBitCast

unsafeBitCast 是非常危險的操作,它會將一個指針指向的內存強制按位轉換為目標的類型。因為這種轉換是在 Swift 的類型管理之外進行的,因此編譯器無法確保得到的類型是否確實正確,你必須明確地知道你在做什么。比如:

1 2 3 4 5 6 let arr = NSArray(object: "meow") let str = unsafeBitCast(CFArrayGetValueAtIndex(arr, 0), CFString.self) str // “meow” ? let arr2 = ["meow2"] let str2 = unsafeBitCast(CFArrayGetValueAtIndex(arr2, 0), CFString.self)

?

因為 NSArray 是可以存放任意 NSObject 對象的,當我們在使用 CFArrayGetValueAtIndex 從中取值的時候,得到的結果將是一個 UnsafePointer<Void>。由于我們很明白其中存放的是 String 對象,因此可以直接將其強制轉換為 CFString。

關于 unsafeBitCast 一種更常見的使用場景是不同類型的指針之間進行轉換。因為指針本身所占用的的大小是一定的,所以指針的類型進行轉換是不會出什么致命問題的。這在與一些 C API 協作時會很常見。比如有很多 C API 要求的輸入是 void *,對應到 Swift 中為 UnsafePointer<Void>。我們可以通過下面這樣的方式將任意指針轉換為 UnsafePointer。

1 2 3 4 5 6 7 8 9 10 var count = 100 var voidPtr = withUnsafePointer(&count, { (a: UnsafePointer<Int>) -> UnsafePointer<Void> in ????return unsafeBitCast(a, UnsafePointer<Void>.self) }) // voidPtr 是 UnsafePointer<Void>。相當于 C 中的 void * voidPtr.memory //Void ? // 轉換回 UnsafePointer<Int> var intPtr = unsafeBitCast(voidPtr, UnsafePointer<Int>.self) intPtr.memory //100

?

轉載于:https://www.cnblogs.com/Free-Thinker/p/5946901.html

總結

以上是生活随笔為你收集整理的Swift 中的指针使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。