面试题答案
一键面试变量和常量在内存管理方面的不同点
- 可变性与内存重新分配:
- 变量:由于其值可以改变,当变量的值发生变化时,如果新值需要更多的内存空间,可能会导致内存重新分配。例如,一个
Int
类型的变量初始值为10,后来改为1000000,若内存空间不足,就可能重新分配内存。 - 常量:一旦初始化后,其值不可改变,所以在内存管理上,常量在初始化后不会因为值的变化而导致内存重新分配,其内存使用相对稳定。
- 变量:由于其值可以改变,当变量的值发生变化时,如果新值需要更多的内存空间,可能会导致内存重新分配。例如,一个
- 内存生命周期:
- 变量:变量的值的改变可能会影响其内存生命周期。比如一个变量被赋值为一个对象,当这个变量被重新赋值为另一个对象时,之前的对象如果没有其他引用,可能会被释放。
- 常量:常量一旦绑定到某个对象,只要常量本身还在作用域内,它所引用的对象就不会因为常量而被提前释放,除非该对象没有其他任何引用。
实际编程中的影响举例
// 定义一个类
class Person {
var name: String
init(name: String) {
self.name = name
print("\(name) 初始化")
}
deinit {
print("\(name) 销毁")
}
}
// 使用变量
var personVariable: Person? = Person(name: "变量引用的人")
personVariable = Person(name: "新的变量引用的人")
// 输出:变量引用的人 初始化
// 变量引用的人 销毁
// 新的变量引用的人 初始化
// 使用常量
let personConstant: Person? = Person(name: "常量引用的人")
// 输出:常量引用的人 初始化
// 常量不会重新赋值,所以不会导致对象提前销毁,除非没有其他引用
在上述例子中,变量personVariable
重新赋值时,之前引用的Person
对象被销毁。而常量personConstant
一旦初始化后,只要常量在作用域内,它所引用的对象就不会因为常量重新赋值(常量不能重新赋值)而被提前销毁。