在更新SWIFT5.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(开始:&值,计数: 1)
初始化“UnsafeBufferPointer”会导致缓冲区指针悬空
我可以使用@silenceWarning,但它是肮脏的解决方案。也许我需要在某个地方储存指针,然后在将来清理它?
发布于 2020-04-08 08:00:59
我也遇到了这些恼人的警告。
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))
}
}
}发布于 2020-03-31 16:26:35
我的代码看上去几乎和你在做的一样,并且收到了同样的警告。我的意见略有不同,与讨论有关。
init<T>(from value: T) {
var value = value
self.init(buffer: UnsafeBufferPointer(start: &value, count: 1))
}这仍然会生成UnsafeBufferPointer正在生成一个悬空指针的警告,但是提示说“生成的指针仅在调用‘init(start:count:)’时才有效。”
但是UnsafeBufferPointer的返回没有分配给任何东西,所以如果我尝试,就不能在init的范围之外使用它。所以这里的编译器警告我不要做一些我无论如何都做不到的事情。
我猜Data.init(buffer:)可能在存储ptr,但我认为如果它接受一个UnsafeBufferPointer,它就承担了正确使用它的责任
不管怎样,这仍然不能解决你的问题。我用这个绕开了警告
init<T>(from value: T) {
var value = value
var myData = Data()
withUnsafePointer(to:&value, { (ptr: UnsafePointer<T>) -> Void in
myData = Data( buffer: UnsafeBufferPointer(start: ptr, count: 1))
})
self.init(myData)
}这并不会生成警告,而且看起来很有效(反正在我的应用程序中)。能否与这里的专家会聚是另一回事。
有点让我怀念HLock和HUnlock的日子
发布于 2020-03-25 21:43:25
这从来都不是安全的,很高兴斯威夫特团队已经清理了它:
let pointer = UnsafeBufferPointer(start: &value, count: 1)在这一行代码的末尾,pointer立即无效。没有承诺value甚至存在于下一行代码中。我不知道你在这里想要实现什么,但这从来不是一个安全的方法。您可能要寻找的是.withUnsafeBytes方法之一,这取决于您在做什么。
https://stackoverflow.com/questions/60857760
复制相似问题