2

如果我想获得一个变量的 unsafemutablerawpointer。然而,如果不创建副本或缓冲区,那么最好/有效的方法是什么?

下面的例子有效!

var number:UInt = 5

let numberPointer = UnsafeMutableRawPointer(&number)

var pointer:UnsafeMutablePointer<UInt8> = numberPointer.bindMemory(to: UInt8.self, capacity: size)

pointer[0] = 88

print(numberPointer) // 88 

然而来自苹果的文档:

文档

4

1 回答 1

1

它不像 Apple 的文档或我的评论那样安全。

如果您想以某种安全的方式进行操作,您可能需要编写如下内容:

var number: UInt = 5

let size = MemoryLayout.size(ofValue: number)
withUnsafeMutableBytes(of: &number) {numberUmbp in
    let numberPointer = numberUmbp.baseAddress!
    let pointer: UnsafeMutablePointer<UInt8> = numberPointer.bindMemory(to: UInt8.self, capacity: size)

    pointer[0] = 88
} //`pointer` (or `numberPointer`) is guaranteed to be valid only inside this closure

print(number) // 88

当然,指针pointer只在闭包内部有效。

如果你想提取一些更稳定和永久的地址,你不能避免在当前的 Swift 规范中创建副本或缓冲区。

于 2018-10-11T06:10:51.307 回答