Swift自動引用計數實踐
自動引用計數實踐
下麵的例子展示了自動引用計數的工作機製。例子以一個簡單的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
類有一個構造函數,此構造函數為實例的name
屬性賦值並打印出信息,以表明初始化過程生效。Person
類同時也擁有析構函數,同樣會在實例被銷毀的時候打印出信息。
接下來的代碼片段定義了三個類型為Person?
的變量,用來按照代碼片段中的順序,為新的Person
實例建立多個引用。由於這些變量是被定義為可選類型(Person?,而不是Person),它們的值會被自動初始化為nil
,目前還不會引用到Person
類的實例。
var reference1: Person?
var reference2: Person?
var reference3: Person?
現在你可以創建Person
類的新實例,並且將它賦值給三個變量其中的一個:
reference1 = Person(name: "John Appleseed")
// prints "John Appleseed is being initialized”
應當注意到當你調用Person
類的構造函數的時候,"John Appleseed is being initialized”會被打印出來。由此可以確定構造函數被執行。
由於Person
類的新實例被賦值給了reference1
變量,所以reference1
到Person
類的新實例之間建立了一個強引用。正是因為這個強引用,ARC 會保證Person
實例被保持在內存中不被銷毀。
如果你將同樣的Person
實例也賦值給其他兩個變量,該實例又會多出兩個強引用:
reference2 = reference1
reference3 = reference1
現在這個Person
實例已經有三個強引用了。
如果你通過給兩個變量賦值nil
的方式斷開兩個強引用()包括最先的那個強引用),隻留下一個強引用,Person
實例不會被銷毀:
reference2 = nil
reference3 = nil
ARC 會在第三個,也即最後一個強引用被斷開的時候,銷毀Person
實例,這也意味著你不再使用這個Person
實例:
reference3 = nil
// prints "John Appleseed is being deinitialized"