Swift 指针
Swift 中认为所有的指针相关操作都是不安全的,所以所有指针相关的结构体都会包含有前缀Unsafe
Swift 中有8个指针类型
UnsafePointer<Pointee> //指针及其所指向的内存内容均不可变
UnsafeMutablePointer<Pointee> // 指针及其所指向的内存内容均可变
UnsafeBufferPointer<Element> // 是一个指针数组内容均不可变
UnsafeMutableBufferPointer<Element>
UnsafeRawPointer // 完全不知道是什么内容的指针
UnsafeMutableRawPointer
UnsafeRawBufferPointer // 完全不知道是什么内容的指针数组
UnsafeMutableRawBufferPointer
let mutablePointer = UnsafeMutablePointer<Int>.allocate(capacity: 1) // 申请内存储存容量
mutablePointer.initialize(to: 2) // 初始化值
print(mutablePointer.pointee)
UnsafePointer
func printPointer(_ pointer: UnsafePointer<Int>) {
print(pointer.pointee)
}
var a = 6
printPointer(&a) // 6
// 绑定值
func withMemoryRebound(_ pointer: UnsafePointer<Int>) {
let rebound = pointer.withMemoryRebound(to: Int.self, capacity: -1) { ptr in
return ptr.pointee > 0
}
print(rebound)
}
withMemoryRebound(&a)
UnsafeMutablePointer 初始化
//通过UnsafePointer 来创建 初始化 UnsafeMutablePointer
public init(mutating other: UnsafePointer<Pointee>)
//通过UnsafePointer可选类型 来创建 初始化 UnsafeMutablePointer 当other 类型为空 返回 nil
public init?(mutating other: UnsafePointer<Pointee>?)
//同上
public init(_ other: UnsafeMutablePointer<Pointee>)
//同上
public init?(_ other: UnsafeMutablePointer<Pointee>?)
allocate
// 为指定数目的实例分配未初始化的内存
@inlinable public static func allocate(capacity count: Int) ->
UnsafeMutablePointer<Pointee>
//释放在这个指针上分配的内存块
@inlinable public func deallocate()
let intPointer = UnsafeMutablePointer<Int>.allocate(capacity: 4)
for i in 0..<4 {
(intPointer + i).initialize(to: i)
}
print(intPointer.pointee)
Prints "0"
initialize
// 目标内存必须未初始化
@inlinable public func initialize(repeating repeatedValue: Pointee, count: Int)
// 目标内存必须未初始化
@inlinable public func initialize(to value: Pointee)
//指针取消初始化指定数量的值
@inlinable public func deinitialize(count: Int) -> UnsafeMutableRawPointer
var array = [1,2,3,4,5]
let pointer = UnsafeMutablePointer(mutating: array)
print(pointer[0])
print(pointer[1])
//1
//2
pointer += 1
print(pointer[0])
print(pointer[1])
//2
//3
UnsafeMutableRawPointer
方法大致同上相同
assumingMemoryBound
var bb: [UInt8] = [UInt8]()
bb.append(1)
bb.append(2)
var rawPoint = UnsafeMutableRawPointer(mutating: bb)
var point = rawPoint.assumingMemoryBound(to: Int8.self)
point[0] = Int8(11)
print(bb) // [11, 2]
advanced
var bb: [UInt8] = [UInt8]()
bb.append(1)
bb.append(2)
var rawPoint = UnsafeMutableRawPointer(mutating: bb)
rawPoint = rawPoint.advanced(by: 1) // 内存指向 + 1
var point = rawPoint.assumingMemoryBound(to: Int8.self)
point[0] = Int8(11)
print(bb) // [1, 11]