Swift 5 的 UnsafeMutablePointer 警告

Giz*_*odo 5 xcode pointers mutable ios swift

我有这个:

let alphaPtr = UnsafeMutablePointer<vImagePixelCount>(mutating: alpha) as UnsafeMutablePointer<vImagePixelCount>?
Run Code Online (Sandbox Code Playgroud)

现在我收到警告:

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

详细警告包括:

  1. 从'[vImagePixelCount]'(又名'Array')到'UnsafePointer'(又名'UnsafePointer')的隐式参数转换会产生一个指针,该指针仅在对'init(mutating:)'的调用期间有效

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

有没有解决的办法?

Raj*_*eti 7

尝试这个

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


Rob*_*ier 6

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

let alphaPtr = UnsafeMutablePointer ...
Run Code Online (Sandbox Code Playgroud)

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

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


Den*_*ira 2

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

var alphaPtr: UnsafeBufferPointer = alpha.withUnsafeBufferPointer { $0 }
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这让我很困惑:无法将“UnsafeBufferPointer&lt;UInt8&gt;”类型的值转换为闭包结果类型“UnsafePointer&lt;UInt8&gt;”? (2认同)