【问题标题】:UnsafeMutablePointer Warning with Swift 5Swift 5 的 UnsafeMutablePointer 警告
【发布时间】:2020-03-26 14:20:36
【问题描述】:

我有这个:

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

现在我收到警告:

“UnsafeMutablePointer”的初始化(又名 'UnsafeMutablePointer') 导致悬空指针

详细的警告包括:

  1. 从“[vImagePixelCount]”(又名“Array”)到“UnsafePointer”(又名)的隐式参数转换 'UnsafePointer') 产生一个仅在持续时间内有效的指针 调用'init(mutating:)'

  2. 在 Array 上使用 'withUnsafeBufferPointer' 方法,以便将参数显式转换为对已定义有效的缓冲区指针 范围

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

【问题讨论】:

  • 您只需要按照详细警告中显示的说明进行操作即可。
  • 这总是错的,现在你被淘汰了。快乐!

标签: ios swift xcode pointers mutable


【解决方案1】:

试试这个

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

【讨论】:

  • 问题代码中提到的变量alpha在哪里?
  • 合法这对我有用!谢谢你。顺便说一句 Scotty,uint8Pointer == alphaPtr.
  • 太棒了!由于 UnsafeMutablePointer ,我在崩溃中挣扎!你的回答帮助了我,谢谢@rajasekhar-pasupuleti 我有一个数组 pixelBuffer - [Float32] 所以我这样做了 let floatPointer = UnsafeMutablePointer.allocate(capacity:pixelBuffer.count) floatPointer.initialize(from: &pixelBuffer, count: pixelBuffer .count)
【解决方案2】:

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

let alphaPtr = UnsafeMutablePointer ...

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

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

【讨论】:

    【解决方案3】:

    你需要使用Array中的withUnsafeBufferPointer方法吗

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

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

    如果您需要 UnsafeRawPointer 作为函数参数,有时使用 &amp;alpha

    【讨论】:

    • 这并不比原始代码更正确。没有保证alphaPtr 在右大括号之后有效。如果您以任何方式使用alphaPtr,则它是未定义的行为,这就是警告告诉您的内容。
    • 这让我明白:无法将类型“UnsafeBufferPointer”的值转换为关闭结果类型“UnsafePointer?”
    猜你喜欢
    • 1970-01-01
    • 2020-01-01
    • 2016-01-19
    • 2017-01-19
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多