静态变量释放时的swift
我想知道何时释放静态变量释放时的swift,swift,Swift,我想知道何时释放静态变量,所以我创建如下: class A { init() { print("A init") } deinit { print("A deinit") } } class B { static let a = A() deinit { print("B deinit") } init() { print("B init") } }
静态变量,所以我创建如下:
class A {
init() {
print("A init")
}
deinit {
print("A deinit")
}
}
class B {
static let a = A()
deinit {
print("B deinit")
}
init() {
print("B init")
}
}
var b: B? = B()
B.a
b = nil
当调用变量a
的deinit
时?如果b=nil
,那么A的deinit
就没有被调用。你是说b
是nil
。这不会更改B.a
,因为a
是静态成员。在您的示例中,a
未取消初始化。如果您希望调用deinit
,则必须将新对象分配给B.a
。然而,B.a是一个常数(let
)。您可以将其更改为var
,否则此特定对象将永远不会被取消初始化
class B {
static var a = A()
\\ ...
}
B.a = A() //deinit of the old `B.a` is called
在本例中,不会这样做,因为B有一个a的强引用,但您可以在B类上创建类似于:静态弱var a=a()
。当B=nil时,它将调用A的deinit,然后调用B的deinit。对象只有在没有其他对象对其进行强引用时才会被去初始化
在您的情况下,b
不包含对a
的引用。类B
为
将b
设置为nil对a
没有任何作用,因为b
从来没有引用过a
<代码>b
基本上是不相关的<代码>a
和b
是不相关的对象
既然我们知道类B
包含对a
的引用,那么我们是否可以以某种方式销毁类B
,以便a
可以取消初始化?答案是否定的。a
类似于全局范围内的变量<代码>仅当程序停止时才会取消初始化
另一种使某事物去初始化的方法是将对它的所有引用设置为引用其他事物。但是,由于在这种情况下,a
是用let
声明的,因此您无法真正更改它。首先,当您将静态属性和方法定义到类(或结构)中时,这些变量将保留在永久生成区域中。它将在所有实例(或值)之间共享
这将通过两种方式发布:
1:当类被释放但无法看到时,因为
类位于堆上的一个特殊区域:永久生成
当应用程序终止时,类将被释放
2:您可以这样强制分配nil
输出
B init
A init
B deinit
A deinit
从未?这是单例实现。
B init
A init
B deinit
A deinit