deinit
到底什么时候被调用?
是否像
C++
一样,当最后一个引用超出范围(通过返回、抛出或退出)时保证被调用?
或者
Swift
使用垃圾收集器?
deinit
旨在释放资源(例如释放不在ARC下的内存)。
deinit
?通常,当最后一个强引用超出范围时,
deinit
立即被调用(然后释放)。
但是:
autorelease
功能(有条件)的影响,deinit
会被显着延迟调用,
在最后一个引用超出范围后很久(当 autorelease
池耗尽时)。deinit
保证永远不会被调用!
(如果尚未调用 deinit
)。deinit
在强引用变量的作用域结束之前被调用:
在 Swift 中,与其他语言不同,当我们将弱引用设置为等于强引用时, 它可能会导致
nil
(Swift 绝对允许)。
如果编译器检测到范围的剩余行,就会发生这种情况, 没有任何强引用。
可能的解决方法是使用
withExtendedLifetime(_:_:)
全局方法/函数,例如:
withExtendedLifetime(myStrongRefVariable) {
// Do something that only needs a non-nil weak reference.
}
C++
析构函数吗?C++
或ObjC
中没有相当于Swift
析构函数。
(
Objective-C++
对象的析构函数(dealloc
)在程序终止期间被调用,
因为这是 C++
规范所要求的,
但仅此而已,Obj-C++ 的 dealloc
行为与 deinit
相同。)
不,但每当
autorelease
功能影响对象时,
deinit
可以推迟(直到自动释放池耗尽,如上所述)。