为什么下面的代码需要我手动使用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
才释放。