0

具体什么时候deinit调用?

当最后一个引用超出范围(通过返回、抛出或退出)时,是否C++保证被调用?

或者正在Swift使用垃圾收集器?

4

2 回答 2

2

您问:

什么时候deinit调用?

简而言之,对于引用类型,当最后一个强引用被删除时,对象被取消初始化。

因此,它通常不是任何特定变量的问题,而是所有引用的问题,当最后一个强引用被删除时,它被取消初始化,就在它被释放之前。请参阅Swift 编程语言、 反初始化自动引用计数

然后你问:

还是 Swift 使用垃圾收集器?

Swift 不使用垃圾收集。曾经有垃圾收集(在早期的 Objective-C 时代,用于 macOS 目标),但它早已被弃用并被引用计数系统所取代,后来随着 ARC(自动引用计数)的引入而简化。但是 Swift 从来没有实现过垃圾回收。

于 2021-08-10T19:52:17.550 回答
0

deinit旨在释放资源(例如释放不在 ARC 下的内存)。

(感谢MartinRob的意见,我们可以在下面得出结论)

什么时候deinit调用?

通常,当最后一个强引用超出范围时, deinit会立即调用(然后释放)。

  • 但是,如果受autorelease功能影响, 则在最后一个引用超出范围(当池耗尽时)deinit很久之后才显着调用。autorelease
  • 并且当应用程序终止时,deinit保证永远不会被调用!?(如果deinit尚未调用)。
  • 同样在极其常见的情况下,deinit在 strong-ref-variable 的作用域结束之前调用:
    • 与其他语言不同,在 Swift 中,当我们将弱引用设置为等于强引用时,它可能会导致nil(这在 Swift 中是绝对允许的)。

    • 如果编译器检测到剩余的范围行没有任何强引用,则会发生这种情况。

    • 可能的解决方法是使用withExtendedLifetime(_:_:)全局方法,例如:

    withExtendedLifetime(myStrongRefVariable) {
         // Do something that only needs non-nil weak reference.
    }
    

它像C++析构函数吗?

在or中没有等效的C++析构函数。ObjCSwift

Objective-C++对象的析构函数在程序终止期间被调用,因为这是C++规范所要求的,但仅此而已,并且 Obj-C++ 的dealloc行为与 .) 相同deinit。)

Swift 使用垃圾收集器吗?

不,但只要autorelease功能影响对象,deinit就可以推迟(直到 autorelease-pool 耗尽,如上所述)。

于 2021-08-10T17:16:11.773 回答