亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

深入講解Swift的內(nèi)存管理

 更新時(shí)間:2017年03月12日 08:42:04   作者:ameerkat  
不管在什么語言里,內(nèi)存管理的內(nèi)容都很重要,Swift使用自動(dòng)引用計(jì)數(shù)來管理應(yīng)用程序的內(nèi)存使用。這表示內(nèi)存管理已經(jīng)是Swift的一部分,在大多數(shù)情況下,你并不需要考慮內(nèi)存的管理。本文主要介紹了Swift中內(nèi)存管理的相關(guān)資料,需要的朋友可以參考。

前言

LLVM編譯器的好:Swift的內(nèi)存管理除了要注意引用循環(huán)之外,幾乎全部被LLVM編譯器包攬,不需要開發(fā)人員操心。

Swift 是自動(dòng)管理內(nèi)存的,這也就是說,我們不再需要操心內(nèi)存的申請(qǐng)和分配。當(dāng)我們通過初始化創(chuàng)建一個(gè)對(duì)象時(shí),Swift 會(huì)替我們管理和分配內(nèi)存。而釋放的原則遵循了自動(dòng)引用計(jì)數(shù) (ARC) 的規(guī)則:當(dāng)一個(gè)對(duì)象沒有引用的時(shí)候,其內(nèi)存將會(huì)被自動(dòng)回收。這套機(jī)制從很大程度上簡(jiǎn)化了我們的編碼,我們只需要保證在合適的時(shí)候?qū)⒁弥每?(比如超過作用域,或者手動(dòng)設(shè)為 nil 等),就可以確保內(nèi)存使用不出現(xiàn)問題。

但是,所有的自動(dòng)引用計(jì)數(shù)機(jī)制都有一個(gè)從理論上無法繞過的限制,那就是循環(huán)引用 (retain cycle) 的情況。

引用循環(huán)問題是什么

Swift 使用 ARC(自動(dòng)引用計(jì)數(shù))的方法為引用類型管理內(nèi)存。

在 Swift 中,當(dāng)聲明引用類型的變量并將對(duì)象負(fù)值給他時(shí),相當(dāng)于創(chuàng)建了對(duì)該對(duì)象的強(qiáng)引用,該對(duì)象的引用計(jì)數(shù)將加1。如果兩個(gè)對(duì)象相互強(qiáng)引用,將導(dǎo)致引用循環(huán)。引用循環(huán)一旦出現(xiàn),相關(guān)的對(duì)象將無法釋放,從而產(chǎn)生內(nèi)存泄漏。

引用循環(huán)問題出現(xiàn)的場(chǎng)景與解決辦法

Swift中類對(duì)象和閉包都是通過引用進(jìn)行傳值,所以以下場(chǎng)景會(huì)出現(xiàn)引用循環(huán):

類對(duì)象相互強(qiáng)引用

兩個(gè)對(duì)象彼此引用對(duì)方時(shí),形成引用循環(huán)。

class Letter { 
 let addressedTo: String 
 var mailbox : MailBox? 

 init( addressedTo: String) {
 self. addressedTo = addressedTo 
 } 

 deinit { 
 printl(" The letter addressed to \(addressedTo) is being discarded") 
 } 
}

class MailBox { 
 let poNumber: Int 
 var letter : Letter? 

 init( poNumber: Int) {
 self. poNumber = poNumber 
 } 

 deinit { 
 print(" P.O Box \(poNumber is going away)") 
 } 
}

Letter 類中強(qiáng)引用了 MailBox 類對(duì)象,MailBox 類中又強(qiáng)引用了 Letter 類對(duì)象形成引用循環(huán)。

解決辦法:聲明對(duì)象時(shí)加入 weak 關(guān)鍵字(弱引用)可以解除強(qiáng)引用。比如將 letter 對(duì)象聲明為 weak 時(shí),mailbox 對(duì)象的引用計(jì)數(shù)不會(huì)加1,從而解除引用循環(huán)。一般將邏輯上屬于另一對(duì)象的對(duì)象聲明為弱對(duì)象。如:

weak var letter : Letter?

閉包中引用包含自身的對(duì)象

閉包中引用包含自身的對(duì)象也會(huì)造成引用循環(huán)。

class MailChecker { 
 let mailbox: MailBox 
 let letter: Letter 

 lazy var whoseMail: () -> String = { 
 return "Letter is addressed to \(self. letter.addressedTo)"
 }

 init(name: String) { 
 self. mailbox = MailBox( poNumber: 311) 
 self. letter = Letter( addressedTo: name) 
 } 

 deinit { 
 println(" class is being deintialized")
 }
}

示例代碼中 whoseMail 的閉包中使用 self 引用了包含自身的 MailChecker 對(duì)象,此時(shí)該閉包擁有 MailChecker 對(duì)象,而 MailChecker 對(duì)象又擁有該閉包,導(dǎo)致引用循環(huán)。

解決辦法:此時(shí)可以添加[unowned self]讓 Swift 知道不應(yīng)保留 self 對(duì)象,從而解除引用循環(huán)。將閉包改為:

lazy var whoseMail: () -> String = { [unowned self] in
 return "Letter is addressed to \(self. letter.addressedTo)"
}

注:代碼均取自 Boisy G. Pitre《Swift基礎(chǔ)教程》

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)各位iOS開發(fā)者們能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

最新評(píng)論