Swift 入門指南 V1.00 - 單元 13 - ARC 與型態安全問題
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 。
接下來把這三個變數都指向名為 Tony 的 CClass 實體 (instance) ,也就是說,這三個變數會是相同的參考
// 三個選擇型態都指向 Tony |
demo1 = CClass(name: "Tony") |
demo2 = demo1 |
demo3 = demo1 |
接下來再把 demo1 跟 demo2 指向 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 |
訂閱:
張貼留言 (Atom)
window.___gcfg = { 'lang': 'zh-TW' };
沒有留言:
張貼留言