使用Apple的Swift编程指南我在ARC的解释中遇到了这个例子;
class Person {
let name: String
init(name: String) {
self.name = name
println("\(name) is being initialized")
}
deinit {
println("\(name) is being deinitialized")
}
}
var reference1: Person?
var reference2: Person?
var reference3: Person?
我理解这样的想法,因为变量属于选项类型,所以它们的初始值为nil,并且不引用Person实例。所以以下内容对我有意义;
reference1 = Person(name: "John Appleseed")
然而,我正在尝试并且惊讶地发现我也可以这样做;
reference1 = Person(name: "Johnny Appleseed")
我期待代码出错,因为我试图更改常量" name"属性。我不仅可以更改此属性我还收到了消息" Johnny Appleseed正在初始化"。如何将常量初始化两次?
答案 0 :(得分:4)
您实际上正在更改现有name
实例的Person
属性。
您正在做的是创建新 Person
,并将其命名为“Johnny”。名为“John”的旧Person
将自动解除分配:
reference1 = Person(name: "John Appleseed")
reference1 = Person(name: "Johnny Appleseed") // "John" is now gone.
除非你有一些指向“John”的其他变量,否则该实例将被解除分配。
会导致编译错误:
reference1 = Person(name: "John Appleseed")
reference1.name = "Johnny Appleseed"
因为您尝试更改使用let
定义的属性的值。
答案 1 :(得分:1)
通过调用Person(name: "Johnny Appleseed")
创建一个新的Person对象来替换reference1
引用的旧Person对象。旧Person对象的常量属性name
根本不会更改,因此不会发出错误。