【发布时间】: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)deinitialize 和 deallocate(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