Swift 指针

1,065 阅读2分钟

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]