具体什么时候deinit
调用?
当最后一个引用超出范围(通过返回、抛出或退出)时,是否C++
保证被调用?
或者正在Swift
使用垃圾收集器?
具体什么时候deinit
调用?
当最后一个引用超出范围(通过返回、抛出或退出)时,是否C++
保证被调用?
或者正在Swift
使用垃圾收集器?
您问:
什么时候
deinit
调用?
简而言之,对于引用类型,当最后一个强引用被删除时,对象被取消初始化。
因此,它通常不是任何特定变量的问题,而是所有引用的问题,当最后一个强引用被删除时,它被取消初始化,就在它被释放之前。请参阅Swift 编程语言、 反初始化和自动引用计数。
然后你问:
还是 Swift 使用垃圾收集器?
Swift 不使用垃圾收集。曾经有垃圾收集(在早期的 Objective-C 时代,用于 macOS 目标),但它早已被弃用并被引用计数系统所取代,后来随着 ARC(自动引用计数)的引入而简化。但是 Swift 从来没有实现过垃圾回收。
deinit
旨在释放资源(例如释放不在 ARC 下的内存)。
(感谢Martin 和Rob的意见,我们可以在下面得出结论)
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++
析构函数。ObjC
Swift
(Objective-C++
对象的析构函数在程序终止期间被调用,因为这是C++
规范所要求的,但仅此而已,并且 Obj-C++ 的dealloc
行为与 .) 相同deinit
。)
不,但只要autorelease
功能影响对象,deinit
就可以推迟(直到 autorelease-pool 耗尽,如上所述)。