Swift 內(nèi)存管理功能是通過(guò)使用自動(dòng)引用計(jì)數(shù)(ARC)來(lái)處理。ARC用于初始化和取消初始化所述系統(tǒng)資源,從而釋放使用的類實(shí)例的存儲(chǔ)器空間當(dāng)實(shí)例不再需要。ARC跟蹤代碼的實(shí)例有效地管理存儲(chǔ)資源之間的關(guān)系的信息。
在每一次一個(gè)新的類實(shí)例被創(chuàng)建時(shí)ARC分配一塊內(nèi)存以存儲(chǔ)信息 init()
關(guān)于實(shí)例類型和其值的信息存儲(chǔ)在存儲(chǔ)器中
當(dāng)類實(shí)例不再需要它自動(dòng)由 deinit() 釋放,用于進(jìn)一步類實(shí)例的存儲(chǔ)和檢索的存儲(chǔ)空間
ARC保存在磁道當(dāng)前參照類實(shí)例的屬性,常量和變量,使得 deinit() 僅適用于那些不使用的實(shí)例。
ARC維護(hù)“強(qiáng)引用”這些類實(shí)例屬性,常量和變量來(lái)限制釋放當(dāng)當(dāng)前的類實(shí)例正在使用。
class StudDetails { var stname: String! var mark: Int! init(stname: String, mark: Int) { self.stname = stname self.mark = mark } deinit { println("Deinitialized \(self.stname)") println("Deinitialized \(self.mark)") } } let stname = "swift" let mark = 98 println(stname) println(mark)
當(dāng)我們使用 playground 運(yùn)行上面的程序,得到以下結(jié)果。
swift 98
class studmarks { let name: String var stud: student? init (name: String) { println("Initializing: \(name)") self.name = name } deinit { println("Deallocating: \(self.name)") } } class student { let name: String var strname: studmarks? init (name: String) { println("Initializing: \(name)") self.name = name } deinit { println("Deallocating: \(self.name)") } } var shiba: studmarks? var mari: student? shiba = studmarks(name: "Swift") mari = student(name: "ARC") shiba!.stud = mari mari!.strname = shiba
當(dāng)我們使用 playground 運(yùn)行上面的程序,得到以下結(jié)果。
Initializing: Swift Initializing: ARC
Class類型屬性有兩種方法可以解決強(qiáng)引用周期:
弱引用
無(wú)主參考
這些引用是用來(lái)使一個(gè)實(shí)例指在一個(gè)基準(zhǔn)周期其他實(shí)例。然后實(shí)例可以為每一個(gè)實(shí)例參考代替處理強(qiáng)引用周期。當(dāng)用戶知道某些情況下可能會(huì)返回 'nil' 值,我們可能會(huì)指向使用弱引用。當(dāng)實(shí)例會(huì)返回不是零的東西,然后使用無(wú)主參考聲明。
class module { let name: String init(name: String) { self.name = name } var sub: submodule? deinit { println("\(name) Is The Main Module") } } class submodule { let number: Int init(number: Int) { self.number = number } weak var topic: module? deinit { println("Sub Module with its topic number is \(number)") } } var toc: module? var list: submodule? toc = module(name: "ARC") list = submodule(number: 4) toc!.sub = list list!.topic = toc toc = nil list = nil
當(dāng)我們使用 playground 運(yùn)行上面的程序,得到以下結(jié)果。
ARC Is The Main Module Sub Module with its topic number is 4
class student { let name: String var section: marks? init(name: String) { self.name = name } deinit { println(上一篇:Swift閉包表達(dá)式下一篇:Swift使用字符