Swift 入門指南 V1.00 - 單元 13 - ARC 與型態安全問題




類別 (class) 的實體物件 (object) 是由參考 (reference) 來記錄的, Swift 利用自動參考計數 (Automatic Reference Counting, ARC) 來管理這些參考



舉例如下


class CClass {
   var name: String
 
   init(name: String) {
      self.name = name
      println("\(name) is being initialized")
   }
 
   deinit {
      println("\(name) is being deinitialized")
   }
}
 
// 三個 CClass 的選擇型態
var demo1: CClass?
var demo2: CClass?
var demo3: CClass?
 
// 三個選擇型態都指向 Tony
demo1 = CClass(name: "Tony")
demo2 = demo1
demo3 = demo1
 
// 兩個選擇型態指向 nil
demo1 = nil
demo2 = nil
 
demo1
demo2
demo3

上面先定義了類別 CClass ,接著建立三個 CClass 選擇型態 (optionals) 的變數 (variable)


// 三個 CClass 的選擇型態
var demo1: CClass?
var demo2: CClass?
var demo3: CClass?

宣告為選擇型態的變數會被初始化為 nil

接下來把這三個變數都指向名為 TonyCClass 實體 (instance) ,也就是說,這三個變數會是相同的參考


// 三個選擇型態都指向 Tony
demo1 = CClass(name: "Tony")
demo2 = demo1
demo3 = demo1

接下來再把 demo1demo2 指向 nil ,原本指向 Tony 的兩個參考會被自動回收,釋出原本的記憶體空間


// 兩個選擇型態指向 nil
demo1 = nil
demo2 = nil

上述程式碼輸入到 Playground ,結果如下



基本上 ARC 的機制運作在程式執行過程中的參考變數,這樣的參考被稱為強參考 (strong reference) ,如果類別中的屬性 (property) 也被宣告成強參考,又同時兩個物件互相參考,執行時會造成強參考循環 (strong reference cycle) ,也就是無法回收強參考佔據的記憶體空間,因而造成記憶體漏失 (memory leak) 。


Swift 提供兩種方式解決記憶體漏失的問題,其一,當屬性需要宣告為選擇型態就加上關鍵字 weak ,使之變成弱參考 (weak reference) ,其二,當屬性不是選擇型態就加上關鍵字 unowned ,使之成為無主參考 (unowned reference) 。


簡單說,關鍵就在屬性是否為選擇型態。 Swift 為型態安全語言 (type safe language) ,主要原因為程式的多數錯誤出現在型態,寫程式時, Xcode 就會進行型態安全檢查,這可有效避免絕大多數的型態問題。


舉一例如下,下例先建立字典 (dictionary) t1 ,裡頭有兩組字串 (string) 的配對資料,然後建立字串 t2 ,接著用 append() 方法將 t1"a"value 附加在 t2 的後面



var t1 = ["a":"1""b":"2"]
t1["a"]
 
var t2 = "0"
t2.append(Character(t1["a"]))
t2

可是輸入到 Playground ,會出現以下的錯誤



錯誤發生在從字典取出來的值是選擇型態,由於選擇型態可能是 nil ,也就是沒有任何值,因此這裡發生了錯誤。


然而如果我們確定是有值的,我們可以在後面加上驚嘆號 ! ,告訴 Xcode 這是有值的,能夠直接使用


t2.append(Character(t1["a"]!))

這樣在 Playground 就能順利執行



接下來我們進入開發軟體的階段,預計發展一個編密碼的 Encrypt 類別,以此介紹更多程式設計的觀念。


中英文術語對照


類別class
物件object
參考reference
自動參考計數Automatic Reference Counting, ARC
選擇型態optionals
變數variable
實體instance
強參考strong reference
屬性property
強參考循環strong reference cycle
記憶體漏失memory leak
弱參考weak reference
無主參考unowned reference
型態安全語言type safe language
字典dictionary
字串string

沒有留言: