nil是一个可选类型,究竟背后是什么?在记忆中它看起来像什么?

时间:2016-07-13 15:44:08

标签: swift class pass-by-reference optional

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

var john: Person?

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

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

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

非常感谢

2 个答案:

答案 0 :(得分:3)

在幕后,选项实际上只是具有相关值的通用enum

enum Optional<T> {
    case some(T)
    case none
}

nil只是Optional.none的简写。因此,在您的示例中,john拥有它所需的所有存储空间;它被设置为一个值,该值恰好发生在表示虚无。现在,因为Person是一个类,它是一个引用类型,&#34;它需要的所有存储&#34;实际上只是指针的空间。对于所有类实例,将在初始化时创建实例属性的存储。

总之: enum的内存,首先是指向Person的关联指针。然后,在初始化变量之后,当然还有一个Person实例。

答案 1 :(得分:2)

有了这个

var john: Person?

Stack

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

此广告位的类型为Optional类型的Person

Optional<Person>

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

此后

john = Person(name: "Mr Robot")

将一些内存分配到Heap

然后按照Person initializer

的逻辑编写该存储器

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