如果 struct 中有类变量,那么 struct 在 Swift 中的行为如何?
我们有这样的代码:
class SomeClass {
... // какие-то переменные, думаю, это не важно
}
struct SomeStruct {
var someClass: SomeClass
}
我知道结构体在栈上,类在堆上。
但是,如果该结构对类具有强引用,那么该结构将位于哪里?该结构是否仍位于堆栈上并引用该类,还是已经作为类位于堆上?
如果 struct 中有类变量,那么 struct 在 Swift 中的行为如何?
我们有这样的代码:
class SomeClass {
... // какие-то переменные, думаю, это не важно
}
struct SomeStruct {
var someClass: SomeClass
}
我知道结构体在栈上,类在堆上。
但是,如果该结构对类具有强引用,那么该结构将位于哪里?该结构是否仍位于堆栈上并引用该类,还是已经作为类位于堆上?
一般来说,结构体也会在栈上,类也会在堆上。在这种情况下,只有指向该类实例的指针将位于堆栈上,而其内容将保留在堆上。
但是,重要的是要了解,在不同情况下,编译器可能出于优化目的将结构和类放置在堆栈和堆上。
将类放入堆栈称为堆栈提升,在编译器知道类实例具有足够结构语义(例如,它不离开函数体)的情况下使用。
反向操作(将结构放置在堆上)用于避免不必要的不可变结构复制,例如,当作为参数传递给函数时。
因此,该问题的正确答案是“视情况而定”,但如果没有任何优化,则应该如答案第一段所示。