下面的例子展示了自動引用計數(shù)的工作機制。例子以一個簡單的Person類開始,并定義了一個叫name的常量屬性:
class Person {
let name: String
init(name: String) {
self.name = name
println("\(name) is being initialized")
}
deinit {
println("\(name) is being deinitialized")
}
}
Person類有一個構(gòu)造函數(shù),此構(gòu)造函數(shù)為實例的name屬性賦值并打印出信息,以表明初始化過程生效。Person類同時也擁有析構(gòu)函數(shù),同樣會在實例被銷毀的時候打印出信息。
接下來的代碼片段定義了三個類型為Person?的變量,用來按照代碼片段中的順序,為新的Person實例建立多個引用。由于這些變量是被定義為可選類型(Person?,而不是Person),它們的值會被自動初始化為nil,目前還不會引用到Person類的實例。
var reference1: Person?
var reference2: Person?
var reference3: Person?
現(xiàn)在你可以創(chuàng)建Person類的新實例,并且將它賦值給三個變量其中的一個:
reference1 = Person(name: "John Appleseed")
// prints "John Appleseed is being initialized”
應(yīng)當(dāng)注意到當(dāng)你調(diào)用Person類的構(gòu)造函數(shù)的時候,"John Appleseed is being initialized”會被打印出來。由此可以確定構(gòu)造函數(shù)被執(zhí)行。
由于Person類的新實例被賦值給了reference1變量,所以reference1到Person類的新實例之間建立了一個強引用。正是因為這個強引用,ARC 會保證Person實例被保持在內(nèi)存中不被銷毀。
如果你將同樣的Person實例也賦值給其他兩個變量,該實例又會多出兩個強引用:
reference2 = reference1
reference3 = reference1
現(xiàn)在這個Person實例已經(jīng)有三個強引用了。
如果你通過給兩個變量賦值nil的方式斷開兩個強引用()包括最先的那個強引用),只留下一個強引用,Person實例不會被銷毀:
reference2 = nil
reference3 = nil
ARC 會在第三個,也即最后一個強引用被斷開的時候,銷毀Person實例,這也意味著你不再使用這個Person實例:
reference3 = nil
// prints "John Appleseed is being deinitialized"