deinitialize() vs deallocate()



为什么下面的代码需要我手动使用unsafe_pointer.deinitialize(count: 1)来取消初始化实例?

如果我只使用unsafe_pointer.deallocate(),实例将在我的内存中仍然存活。那么使用deallocate()的目的是什么呢?

很抱歉,因为我是第一次学习MRC。

class Unsafe_Memory {
var name = "Hello World"
deinit {
print("(type(of: self)) is deinited and deallocated")
}
}
let unsafe_pointer: UnsafeMutablePointer<Unsafe_Memory> = .allocate(capacity: 1)
unsafe_pointer.pointee = Unsafe_Memory()
dump(unsafe_pointer.pointee)
unsafe_pointer.pointee.name = "Changed"
dump(unsafe_pointer.pointee)
unsafe_pointer.deinitialize(count: 1)
unsafe_pointer.deallocate()

您必须在任何重要类型上调用deinitialize。根据Apple Docs,

普通类型可以逐位复制,不需要间接或引用计数操作。一般来说,原生Swift类型会这样做不包含强或弱引用或其他形式的间接都是微不足道的,就像导入的C结构体和枚举一样。复制内存包含非平凡类型的值只能安全地使用类型的指针。直接从内存中的非平凡复制字节值不会生成有效的副本,只能通过调用C API,如memmove()。

调用deinitialize首先取消初始化该内存,但正如文档所述,"调用deinitialize(count:)后,内存未初始化,但仍绑定到Pointee类型"。

之后,通过调用deallocate()释放该内存块,类似于c中的free()deallocate()只能在非平凡类型或未初始化的内存块上调用。

如果类型不重要,则不必调用deinitialize。无论如何,调用deinitialize可能是好的,以防将来你的类型变得不平凡,调用它不应该花费你任何东西。

你可以在不调用deallocate的情况下运行你的代码。deinit块仍然会被执行,因为deinitialize将运行该块。但是,该内存块仍然被占用,直到调用deallocate才释放。

最新更新