位置:首頁 > 高級語言 > Swift教學 > Swift自動引用計數實踐

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變量,所以reference1Person類的新實例之間建立了一個強引用。正是因為這個強引用,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"