为啥结构在 Swift 中没有像类一样的反初始化器?

Posted

技术标签:

【中文标题】为啥结构在 Swift 中没有像类一样的反初始化器?【英文标题】:Why don't structs have deinitializers in Swift like classes?为什么结构在 Swift 中没有像类一样的反初始化器? 【发布时间】:2018-10-28 04:04:11 【问题描述】:

我刚刚浏览了 deinitializers 的 Swift 文档,发现它们只存在于类中。所以我只是想知道为什么 Swift 中的结构没有反初始化器?

【问题讨论】:

因为他们不需要它们? 请回复***.com/questions/46842577/…上的cmets 假设结构确实有反初始化器,你想用它们做什么? Deinitializers 仅适用于 class 类型,如文档中所述。 【参考方案1】:

deinit 用于引用类型(请参阅https://***.com/a/27366050/341994 了解其含义),其中指向的对象独立存在,直到引用计数降至零。

结构是一个值类型,不需要deinit 的内存管理。结构不像类那样独立持久。仅仅设置结构的属性就会破坏它并替换它。分配一个结构会复制它。结构以高度轻量级的方式创建和销毁。他们不需要发出毁灭的信号;它们太轻了。

【讨论】:

所以在struct中我们也不需要使用“weak var someStruct”?【参考方案2】:

结构超出范围时会被释放。您不能将deinit 放入结构中,但这是一种解决方法。您可以创建一个结构,该结构具有对释放时打印某些内容的类的引用。

class DeallocPrinter 
    deinit 
        print("deallocated")
    


struct SomeStruct 
    let printer = DeallocPrinter()
  

所以当结构被释放时 - 如果你没有复制结构,它会在释放时打印 deallocated,因为 DeallocPrinter 将在结构被释放的同时被释放。 此外,结构并没有类所具有的实例(即它们没有标识),也没有对结构的“引用”。

【讨论】:

您的解决方法无效。在结构体的最后一个副本超出范围之前,它不会打印消息。 聪明的解决方案。

以上是关于为啥结构在 Swift 中没有像类一样的反初始化器?的主要内容,如果未能解决你的问题,请参考以下文章

iOS学习笔记44-Swift枚举和结构体

Python——property(使一个方法看起来就像类属性一样)

为啥最新的 Swift 版本总是说变量在使用前没有初始化

为啥在 Swift 中甚至需要方便关键字?

Swift 学习笔记 (初始化)

Swift Classstruct