可选类型中的 nil,它背后到底是什么?它在记忆中是什么样子?

SLN*_*SLN 5 class pass-by-reference optional swift

class Person{
    let name: String
    init(name: String) {
        self.name = name
    }
}

var john: Person?
Run Code Online (Sandbox Code Playgroud)

上面的代码片段定义了一个名为 的可选类型变量john。此时,变量的初始值为nil

类实例将其值保存在堆空间中并将引用存储在堆栈中。(如果我错了,请纠正我)john在这种情况下是一个未分配的可选变量,它还没有引用任何实例。

问题:PC 在哪里存储名称字符串“john”?它是否已经被创建并存储在堆栈中并等待对堆中某个实例的引用?值“nil”存储在哪里?

非常感谢

Luc*_*tti 3

有了这个

var john: Person?
Run Code Online (Sandbox Code Playgroud)

在 的顶部添加了一个内存插槽Stack

该槽的类型是Optionalvalue of typePerson

Optional<Person>
Run Code Online (Sandbox Code Playgroud)

在这个内存位置中我们找到了该Optional.none值。

在这之后

john = Person(name: "Mr Robot")
Run Code Online (Sandbox Code Playgroud)

一些内存被分配到Heap.

然后按照 的逻辑写入该存储器Person initializer

然后让我们回到堆栈。这里Optional.none被替换为值Optional.some,并且对象的地址内存Person被写入枚举值的特殊 a 字段内。