swift - UnsafeMutableRawPointer(变量)有多安全

标签 swift unsafemutablepointer

如果我想获得一个变量的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 

来自苹果的文档:

docs

最佳答案

它不像 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 规范中。

关于swift - UnsafeMutableRawPointer(变量)有多安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52752791/

相关文章:

ios - PushViewController 崩溃

ios - Swift 中的约束没有做我想做的事

Swift 解除分配与免费使用

ios - 无法在 UISearchController 上成为 FirstResponder 工作

ios - 添加 CLLocationDistances

swift - Xcode 中的 "' deinitialize() ' is deprecated: the default argument to deinitialize(count:) has been removed"警告

ios - Swift 缓冲区指针和数组索引

swift - UnsafeMutablePointer.pointee和didSet属性

ios - 如何检测在 navigationController 中结束的弹出/推送动画

ios - 在swift中将值输出到typedef指针