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

如果我只使用unsafe_pointer.deallocate(),那么这个实例在我的记忆中仍然是活的.那么,使用deallocate()的目的是什么呢?

很抱歉,因为我是第一次try 学习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名,

简单类型可以逐位复制,没有间接性或 引用计数操作.一般来说,原生的雨燕类型 不包含强引用或弱引用或其他形式的间接 是琐碎的,就像导入的C struct 和枚举一样.正在复制内存, 包含非平凡类型的值只能使用 类型化指针.直接从重要的内存中复制字节 值不会生成有效的副本,只能通过调用 C API,如MemMove().

调用deinitialize首先取消对该内存的初始化,但作为docs的状态,"在调用deinitialize(count:)之后,内存未初始化,但仍绑定到Pointee类型".

在此之后,您可以通过调用deallocate()来释放内存块,类似于C中的free().deallocate()只能在非平凡类型或未初始化的内存块上调用.

如果类型是微不足道的,则不必调用deinitialize.不管怎样,最好还是拨打deinitialize,以防你的类型在future 变得不那么微不足道,而且打电话给它应该不会花你一分钱.

您可以try 运行您的代码,而无需拨打deallocate.deinit块仍将被执行,因为deinitialize将运行该块.但是,在您呼叫deallocate之前,该内存块仍被占用且不会被释放.

Swift相关问答推荐

我应该在自定义存储队列上使用弱self 吗?

如何在visionOS中进行购买?&# 39;购买(选项:)在visionOS中不可用

为SwiftUI文本视图提供固定宽度,并仅在文本换行时使文本视图底部增大

SwiftData:非法try 在不同上下文中的对象之间建立关系

在 init(from decoder: Decoder) 方法中访问原始 JSON 数据

在这个使用 URLSession 的简单 case 中是否创建了一个强引用循环?

列表不显示信息

如何从我的 macOS 应用程序打开 (.log) 文件?

如何在 swiftui 中设置给定字符串类型日期的日期倒计时?

String(validatingUTF8:) 和 String(utf8String:) 之间有区别吗?

如何为等待函数调用添加超时

Swift:创建用于调用 C 函数的指针数组

如何删除标签和步进按钮之间的间距是 SwiftUI Stepper?

获取 SwiftUI 中 Binding 的值更改更新

NSFontAttributeName 已更改为 String

Swift 覆盖实例变量

Swift 中的 PageViewController 当前页面索引

如何从 Swift 中的字符串生成条形码?

Swift 2.0 中的 do { } catch 不处理从这里抛出的错误

如何在 SwiftUI 中为删除和禁用配置 ContextMenu 按钮?