swift - 警告: Initialization of 'UnsafeBufferPointer<T>' results in a dangling buffer pointer

标签 swift unsafe-pointers swift5.2 xcode11.4

在更新到Swift 5.2/Xcode 11.4之后,警告以下代码:

extension Data {

    init<T>(from value: T) {
        var value = value
        let pointer = UnsafeBufferPointer(start: &value, count: 1)
        self.init(buffer: pointer)
    }

    func to<T>(type: T.Type) -> T {
        return self.withUnsafeBytes { $0.load(as: T.self) }
    }
}

行上,让指针= UnsafeBufferPointer(开始:&value,计数:1)我得到了

Initialization of 'UnsafeBufferPointer' results in a dangling buffer pointer



我可以使用@silenceWarning,但这是肮脏的解决方案。也许我需要将指针存储在某个地方并在将来进行清理?

最佳答案

我也遇到了这些烦人的警告。

var str = "aaaaabbbbbccccc"
var num1 = 1
var num2 = 22

var data = Data()
// Initialization of 'UnsafeBufferPointer<String>' results in a dangling buffer pointer
data.append(UnsafeBufferPointer(start: &str, count: 1)) 
// Initialization of 'UnsafeBufferPointer<Int>' results in a dangling buffer pointer
data.append(UnsafeBufferPointer(start: &num1, count: 1))
// Initialization of 'UnsafeBufferPointer<Int>' results in a dangling buffer pointer 
data.append(UnsafeBufferPointer(start: &num2, count: 1)) 

考虑到@greg的回答,我将Data.append放入withUnsafePointer的闭包中,它不再显示警告。

withUnsafePointer(to: &str) { data.append(UnsafeBufferPointer(start: $0, count: 1)) } // ok
withUnsafePointer(to: &num1) { data.append(UnsafeBufferPointer(start: $0, count: 1)) } // ok
withUnsafePointer(to: &num2) { data.append(UnsafeBufferPointer(start: $0, count: 1)) } // ok

这是扩展名

extension Data {
    init<T>(value: T) {
        self = withUnsafePointer(to: value) { (ptr: UnsafePointer<T>) -> Data in
            return Data(buffer: UnsafeBufferPointer(start: ptr, count: 1))
        }
    }

    mutating func append<T>(value: T) {
        withUnsafePointer(to: value) { (ptr: UnsafePointer<T>) in
            append(UnsafeBufferPointer(start: ptr, count: 1))
        }
    }
}

关于swift - 警告: Initialization of 'UnsafeBufferPointer<T>' results in a dangling buffer pointer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60857760/

相关文章:

swift - 如何快速将自身转换为UnsafeMutablePointer <Void>类型

swift - 如何扩展 String 的 UnsafePointer<Int8> 初始值设定项以接受 NULL 指针?

ios - 观察 SwiftUI TextField 上的变化

arrays - 将对象数组解析为 swift JSON 对象中的字符串元素数组

arrays - 快速编码数组中的不同键

swift - 简化 CFG Swift Enum Rawvalue

ios - EXC_BAD_INSTRUCTION 对象数组分配 Swift

c# - 声明指向类定义结构的指针,其中类是通用的