UnsafeRawPointer
聲明
@frozen struct UnsafeRawPointer
概述
UnsafeRawPointer
類型不提供自動內存管理、類型安全和對齊保證。您有責任通過不安全的指針處理您使用的任何內存的生命周期,以避免泄漏或未定義的行為。
您手動管理的內存可以是特定類型的untyped
或bound
。您可以使用 UnsafeRawPointer
類型來訪問和管理內存中的原始字節,無論該內存是否已綁定到特定類型。
了解指針的內存狀態
UnsafeRawPointer
實例引用的內存可以處於多種狀態之一。許多指針操作隻能應用於內存處於特定狀態的指針——您必須跟蹤正在使用的內存的狀態,並了解不同操作執行的對該狀態的更改。內存可以是無類型的和未初始化的,綁定到一個類型但未初始化,或者綁定到一個類型並初始化為一個值。最後,先前分配的內存可能已被釋放,留下現有指針引用未分配的內存。
未初始化的原始內存
剛剛分配的原始內存處於uninitialized, untyped
狀態。未初始化的內存必須使用類型的值進行初始化,然後才能用於任何類型化的操作。
要將未初始化的內存綁定到類型而不對其進行初始化,請使用bindMemory(to:count:)
方法。此方法返回一個類型化的指針,以便進一步對內存進行類型化訪問。
打字 memory
已綁定到某個類型的內存,無論是已初始化的還是未初始化的,通常使用類型化指針(例如 UnsafePointer
和 UnsafeMutablePointer
的實例)來訪問。可以使用UnsafeMutablePointer
方法執行初始化、分配和取消初始化。
隻有在取消初始化或綁定類型為 trivial type
後,才能將已綁定到類型的內存重新綁定到其他類型。取消初始化類型化內存不會取消綁定該內存的類型。可以使用相同類型的值重新初始化已取消初始化的內存,綁定到新類型或解除分配。
當內存綁定到類型時,從內存中讀取原始字節時,您必須確保滿足任何對齊要求。
原始指針算術
原始指針的指針運算在字節級別執行。當您添加或減去原始指針時,結果是一個新的原始指針偏移該字節數。以下示例分配四個字節的內存並將0xFF
存儲在所有四個字節中:
let bytesPointer = UnsafeMutableRawPointer.allocate(byteCount: 4, alignment: 4)
bytesPointer.storeBytes(of: 0xFFFF_FFFF, as: UInt32.self)
// Load a value from the memory referenced by 'bytesPointer'
let x = bytesPointer.load(as: UInt8.self) // 255
// Load a value from the last two allocated bytes
let offsetPointer = bytesPointer + 2
let y = offsetPointer.load(as: UInt16.self) // 65535
上麵的代碼將值0xFFFF_FFFF
存儲到四個新分配的字節中,然後將第一個字節作為UInt8
實例加載,將第三和第四個字節作為UInt16
實例加載。
永遠記得釋放你自己分配的任何內存。
bytesPointer.deallocate()
隱式轉換和橋接
當使用 UnsafeRawPointer
參數調用函數或方法時,您可以傳遞該特定指針類型的實例,傳遞兼容指針類型的實例,或使用 Swift 的隱式橋接來傳遞兼容指針。
例如,以下代碼示例中的 print(address:as:)
函數將 UnsafeRawPointer
實例作為其第一個參數:
func print<T>(address p: UnsafeRawPointer, as type: T.Type) {
let value = p.load(as: type)
print(value)
}
與 Swift 中的典型情況一樣,您可以使用 UnsafeRawPointer
實例調用 print(address:as:)
函數。此示例將 rawPointer
作為初始參數傳遞。
// 'rawPointer' points to memory initialized with `Int` values.
let rawPointer: UnsafeRawPointer = ...
print(address: rawPointer, as: Int.self)
// Prints "42"
因為類型化指針在作為參數傳遞時可以隱式轉換為原始指針,所以您也可以使用任何可變或不可變類型化指針實例調用print(address:as:)
。
let intPointer: UnsafePointer<Int> = ...
print(address: intPointer, as: Int.self)
// Prints "42"
let mutableIntPointer = UnsafeMutablePointer(mutating: intPointer)
print(address: mutableIntPointer, as: Int.self)
// Prints "42"
或者,您可以使用 Swift 的 implicit bridging
將指針傳遞給實例或數組的元素。使用 inout 語法隱式創建指向任何類型實例的指針。以下示例在調用 print(address:as:)
時使用隱式橋接傳遞指向 value
的指針:
var value: Int = 23
print(address: &value, as: Int.self)
// Prints "23"
當您將數組作為參數傳遞時,會隱式創建指向數組元素的不可變指針。此示例在調用 print(address:as:)
時使用隱式橋接將指針傳遞給 numbers
的元素。
let numbers = [5, 10, 15, 20]
print(address: numbers, as: Int.self)
// Prints "5"
您還可以使用 inout 語法將可變指針傳遞給數組的元素。因為print(address:as:)
需要一個不可變指針,雖然這在語法上是有效的,但它不是必需的。
var mutableNumbers = numbers
print(address: &mutableNumbers, as: Int.self)
可用版本
相關用法
- Swift UnsafeRawPointer advanced(by:)用法及代碼示例
- Swift UnsafeRawPointer ...(_:_:)用法及代碼示例
- Swift UnsafeRawPointer ..<(_:)用法及代碼示例
- Swift UnsafeRawPointer bindMemory(to:capacity:)用法及代碼示例
- Swift UnsafeRawPointer ...(_:)用法及代碼示例
- Swift UnsafeRawPointer withMemoryRebound(to:capacity:_:)用法及代碼示例
- Swift UnsafeRawPointer ..<(_:_:)用法及代碼示例
- Swift UnsafeRawBufferPointer.Iterator dropFirst(_:)用法及代碼示例
- Swift UnsafeRawBufferPointer.Iterator max()用法及代碼示例
- Swift UnsafeRawBufferPointer shuffled(using:)用法及代碼示例
- Swift UnsafeRawBufferPointer isEmpty用法及代碼示例
- Swift UnsafeRawBufferPointer enumerated()用法及代碼示例
- Swift UnsafeRawBufferPointer subscript(_:)用法及代碼示例
- Swift UnsafeRawBufferPointer starts(with:)用法及代碼示例
- Swift UnsafeRawBufferPointer.Iterator filter(_:)用法及代碼示例
- Swift UnsafeRawBufferPointer firstIndex(where:)用法及代碼示例
- Swift UnsafeRawBufferPointer.Iterator drop(while:)用法及代碼示例
- Swift UnsafeRawBufferPointer.Iterator min()用法及代碼示例
- Swift UnsafeRawBufferPointer.Iterator contains(where:)用法及代碼示例
- Swift UnsafeRawBufferPointer contains(where:)用法及代碼示例
- Swift UnsafeRawBufferPointer.Iterator contains(_:)用法及代碼示例
- Swift UnsafeRawBufferPointer.Iterator reduce(into:_:)用法及代碼示例
- Swift UnsafeRawBufferPointer first(where:)用法及代碼示例
- Swift UnsafeRawBufferPointer.Iterator map(_:)用法及代碼示例
- Swift UnsafeRawBufferPointer allSatisfy(_:)用法及代碼示例
注:本文由純淨天空篩選整理自apple.com大神的英文原創作品 UnsafeRawPointer。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。