MST
星途 面试题库

面试题:Swift变量与常量的作用域及生命周期

假设在Swift的一个类中有一个常量和一个变量,常量在初始化时被赋值,变量在类的方法中被多次赋值。请分析这两个量的作用域和生命周期,并且说明如果在一个闭包中捕获这两个量,会对它们的生命周期产生怎样的影响,给出相应代码说明。
36.3万 热度难度
编程语言Swift

知识考点

AI 面试

面试题答案

一键面试
  1. 常量和变量的作用域与生命周期
    • 常量
      • 作用域:在定义它的类中,从定义处开始到类结束都可见。例如,如果在类的属性位置定义,在类的所有方法和闭包中都可以访问。
      • 生命周期:与类实例的生命周期相同。当类实例被创建时,常量被初始化,直到类实例被释放,常量一直存在。
    • 变量
      • 作用域:同样在定义它的类中,从定义处开始到类结束都可见。在类的方法中可以多次赋值。
      • 生命周期:与类实例的生命周期相同。类实例创建时变量初始化,类实例释放时变量销毁。
  2. 闭包捕获常量和变量对生命周期的影响
    • 当闭包捕获常量和变量时,会强持有这些量,从而延长它们的生命周期。即使在闭包外部类实例原本可能被释放的情况下,由于闭包的强引用,类实例及其包含的常量和变量也不会被释放,直到闭包被释放。
  3. 示例代码
class MyClass {
    let constantValue: Int
    var variableValue: Int

    init(constant: Int, variable: Int) {
        self.constantValue = constant
        self.variableValue = variable
    }

    func doSomething() {
        let closure = {
            print("Constant: \(self.constantValue), Variable: \(self.variableValue)")
        }
        self.variableValue = 100
        closure()
    }
}

let myObject = MyClass(constant: 42, variable: 24)
myObject.doSomething()

在上述代码中,constantValue 是常量,variableValue 是变量。doSomething 方法中的闭包捕获了这两个属性。闭包的存在使得 MyClass 实例及其属性在闭包存在期间不会被释放,即使在闭包外部没有对 myObject 的强引用。