静态变量释放时的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