【问题标题】:Swift 4.1 deinitialize and deallocate(capacity:) deprecatedSwift 4.1 deinitialize 和 deallocate(capacity:) 已弃用
【发布时间】:2018-07-12 05:17:12
【问题描述】:

我一直这么说是为了形成一个CGPoint的C数组:

let arr = UnsafeMutablePointer<CGPoint>.allocate(capacity:4)
defer {
    arr.deinitialize()
    arr.deallocate(capacity:4)
}
arr[0] = CGPoint(x:0,y:0)
arr[1] = CGPoint(x:50,y:50)
arr[2] = CGPoint(x:50,y:50)
arr[3] = CGPoint(x:0,y:100)

现在(Xcode 9.3 测试版中的 Swift 4.1)deinitializedeallocate(capacity:) 都已弃用。看来我现在应该说的可能是:

defer {
    arr.deinitialize(count:4)
    arr.deallocate()
}

是吗?

【问题讨论】:

  • 请注意,您不必调用.deinitialize,因为CGPoint 是普通类型(如果它不是普通类型,即包含引用,那么您必须初始化分配的执行分配之前的内存,然后取消初始化)。
  • @Hamish 是的,我总是对此感到困惑,所以我总是说 deinitialize 以防万一。
  • @Hamish 例如stackoverflow.com/questions/46814457/… - 这也是我被“教导”的,只是deinitialize 因为为什么不这样做
  • 还不错;尽管要 100% 万无一失,但您可能希望首先使用 .initialize 方法之一初始化内存(即在通过下标分配之前)。您还可以使用缓冲区指针 (gist.github.com/hamishknight/57320e2dbfbd0ad3ef68c69a97830eac)。
  • 似乎(从 defer 语句)该数组仅在某些本地范围内使用。不直接使用 Swift 数组 let arr = [CGPoint(x:0,y:0), ...] 有什么特殊原因吗?如有必要,您仍然可以将其传递给 C 函数。

标签: swift unsafe-pointers swift4.1


【解决方案1】:

是的,这是SE-0184 Unsafe[Mutable][Raw][Buffer]Pointer: add missing methods, adjust existing labels for clarity, and remove deallocation size 的一部分, 已在 Swift 4.1 中实现。

特别是:

从 deallocate(capacity:) 中删除容量将结束对 deallocate() 作用的混淆,从而清楚地表明 deallocate() 将在自身释放整个内存块,就像对其调用 free() 一样。

旧的 deallocate(capacity:) 方法应标记为已弃用并最终删除,因为它目前鼓励危险的不正确代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    相关资源
    最近更新 更多