class Person{
let name: String
init(name: String) {
self.name = name
}
}
var john: Person?
上面的代码片段定义了一个名为john
的可选类型的变量。此时,变量的初始值为 nil 。
类实例将其值保存在堆空间中,并将引用存储在堆栈中。 (如果我错了,请纠正我)john
在这种情况下是未分配的可选变量,它还没有引用任何实例。
问题:PC在哪里存储名称字符串" john"?它是否已经创建并存储在堆栈中并等待堆中的某个实例的引用?价值" nil"存储在哪里?
非常感谢
答案 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.some
,Person
对象的地址内存写入枚举值的特殊字段内。