使用 Swift 5 的 UnsafeMutablePointer 警告

UnsafeMutablePointer Warning with Swift 5

提问人:Gizmodo 提问时间:3/26/2020 最后编辑:Gizmodo 更新时间:5/27/2020 访问量:8817

问:

我有这个:

let alphaPtr = UnsafeMutablePointer<vImagePixelCount>(mutating: alpha) as UnsafeMutablePointer<vImagePixelCount>?

现在我收到警告:

“UnsafeMutablePointer”(又名 'UnsafeMutablePointer') 导致指针悬空

详细警告包括:

  1. 从“[vImagePixelCount]”(又名“Array”)到“UnsafePointer”(又名 'UnsafePointer') 生成仅在持续时间内有效的指针 对 'init(mutating:)' 的调用

  2. 在 Array 上使用“withUnsafeBufferPointer”方法,以便将参数显式转换为对定义的 范围

有没有办法解决这个问题?

iOS的 迅速 xcode的 指针 可变

评论

2赞 OOPer 3/26/2020
您只需要按照详细警告中显示的说明进行操作即可。
3赞 matt 3/27/2020
这总是错的,现在你被破坏了。很高兴!

答:

2赞 TheOliverDenis 3/27/2020 #1

您是否需要使用 Array 中的方法作为withUnsafeBufferPointer

var alphaPtr: UnsafeBufferPointer = alpha.withUnsafeBufferPointer { $0 }

这是命令,如果您需要使用特定类型,请生成一个指针,该指针是可选的,您可以使用或符合您要求的其他函数。bindMemory(to:)

如果需要 a 作为函数参数,有时使用 a。&alphaUnsafeRawPointer

评论

1赞 Rob Napier 3/27/2020
这并不比原始代码更正确。在右大括号之后没有有效的承诺。如果您以任何方式使用它,则为未定义的行为,这就是警告告诉您的内容。alphaPtralphaPtr
2赞 ScottyBlades 6/17/2020
这让我:无法将“UnsafeBufferPointer<UInt8>”类型的值转换为闭合结果类型“UnsafePointer<UInt8>?
7赞 Rob Napier 3/27/2020 #2

这样做从来都不安全,编译器现在更积极地警告你。

let alphaPtr = UnsafeMutablePointer ...

在此行的末尾,已经无效。不能保证它所指向的仍然是分配的内存。alphaPtr

相反,您需要将所需的任何用法嵌套到(或)块中。如果无法将其嵌套到块中(例如,如果要存储指针或返回指针),则无法使其正确。您必须重新设计数据管理,使其不需要这样做。withUnsafeMutablePointer()withUnsafePointer()

10赞 Rajasekhar Pasupuleti 5/27/2020 #3

试试这个

var bytes = [UInt8]()
let uint8Pointer = UnsafeMutablePointer<UInt8>.allocate(capacity: bytes.count)
uint8Pointer.initialize(from: &bytes, count: bytes.count)

评论

1赞 ScottyBlades 7/10/2020
问题代码中提到的变量在哪里?alpha
1赞 twohyjr 12/13/2020
合法的这对我有用!谢谢。顺便说一句,Scotty,uint8Pointer == alphaPtr。
0赞 Waaheeda 5/28/2021
棒!由于 UnsafeMutablePointer,我正在为崩溃而苦苦挣扎!你的回答帮助我谢谢你 @rajasekhar-pasupuleti 我有一个数组 pixelBuffer - [Float32] 所以我这样做了 let floatPointer = UnsafeMutablePointer<Float32>.allocate(capacity:pixelBuffer.count) floatPointer.initialize(from: &pixelBuffer, count: pixelBuffer.count)