5

我一直这样说是为了形成一个 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 beta 中的 Swift 4.1)deinitializedeallocate(capacity:)都已弃用。看起来我现在应该说的可能是:

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

是对的吗?

4

1 回答 1

6

是的,这是SE-0184 Unsafe[Mutable][Raw][Buffer]Pointer 的一部分:添加缺失的方法,调整现有标签以保持清晰,并删除释放大小,这已在 Swift 4.1 中实现。

尤其:

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

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

于 2018-02-01T19:36:28.010 回答