提问人:Gizmodo 提问时间:3/26/2020 最后编辑:Gizmodo 更新时间:5/27/2020 访问量:8817
使用 Swift 5 的 UnsafeMutablePointer 警告
UnsafeMutablePointer Warning with Swift 5
问:
我有这个:
let alphaPtr = UnsafeMutablePointer<vImagePixelCount>(mutating: alpha) as UnsafeMutablePointer<vImagePixelCount>?
现在我收到警告:
“UnsafeMutablePointer”(又名 'UnsafeMutablePointer') 导致指针悬空
详细警告包括:
从“[vImagePixelCount]”(又名“Array”)到“UnsafePointer”(又名 'UnsafePointer') 生成仅在持续时间内有效的指针 对 'init(mutating:)' 的调用
在 Array 上使用“withUnsafeBufferPointer”方法,以便将参数显式转换为对定义的 范围
有没有办法解决这个问题?
答:
2赞
TheOliverDenis
3/27/2020
#1
您是否需要使用 Array 中的方法作为withUnsafeBufferPointer
var alphaPtr: UnsafeBufferPointer = alpha.withUnsafeBufferPointer { $0 }
这是命令,如果您需要使用特定类型,请生成一个指针,该指针是可选的,您可以使用或符合您要求的其他函数。bindMemory(to:)
如果需要 a 作为函数参数,有时使用 a。&alpha
UnsafeRawPointer
评论
1赞
Rob Napier
3/27/2020
这并不比原始代码更正确。在右大括号之后没有有效的承诺。如果您以任何方式使用它,则为未定义的行为,这就是警告告诉您的内容。alphaPtr
alphaPtr
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)
评论