麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Swift > 正文

深入講解Swift的內存管理

2020-03-09 17:46:22
字體:
來源:轉載
供稿:網友

前言

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

Swift 是自動管理內存的,這也就是說,我們不再需要操心內存的申請和分配。當我們通過初始化創建一個對象時,Swift 會替我們管理和分配內存。而釋放的原則遵循了自動引用計數 (ARC) 的規則:當一個對象沒有引用的時候,其內存將會被自動回收。這套機制從很大程度上簡化了我們的編碼,我們只需要保證在合適的時候將引用置空 (比如超過作用域,或者手動設為 nil 等),就可以確保內存使用不出現問題。

但是,所有的自動引用計數機制都有一個從理論上無法繞過的限制,那就是循環引用 (retain cycle) 的情況。

引用循環問題是什么

Swift 使用 ARC(自動引用計數)的方法為引用類型管理內存。

在 Swift 中,當聲明引用類型的變量并將對象負值給他時,相當于創建了對該對象的強引用,該對象的引用計數將加1。如果兩個對象相互強引用,將導致引用循環。引用循環一旦出現,相關的對象將無法釋放,從而產生內存泄漏。

引用循環問題出現的場景與解決辦法

Swift中類對象和閉包都是通過引用進行傳值,所以以下場景會出現引用循環:

類對象相互強引用

兩個對象彼此引用對方時,形成引用循環。

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 類中強引用了 MailBox 類對象,MailBox 類中又強引用了 Letter 類對象形成引用循環。

解決辦法:聲明對象時加入 weak 關鍵字(弱引用)可以解除強引用。比如將 letter 對象聲明為 weak 時,mailbox 對象的引用計數不會加1,從而解除引用循環。一般將邏輯上屬于另一對象的對象聲明為弱對象。如:

weak var letter : Letter?

閉包中引用包含自身的對象

閉包中引用包含自身的對象也會造成引用循環。

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 對象,此時該閉包擁有 MailChecker 對象,而 MailChecker 對象又擁有該閉包,導致引用循環。

解決辦法:此時可以添加[unowned self]讓 Swift 知道不應保留 self 對象,從而解除引用循環。將閉包改為:

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

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

總結

以上就是這篇文章的全部內容了,希望本文的內容對各位iOS開發者們能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 在线中文字幕不卡 | 中文在线观看www | 在线91视频 | 国产91精品一区二区麻豆亚洲 | 国产91免费看 | 九九热播视频 | 欧美hdfree性xxxx | 亚洲第一页综合 | 国产亚洲精久久久久久蜜臀 | 色网站免费观看 | 超碰人人做人人爱 | 欧美成年人视频 | 91久久夜色精品国产网站 | 三级xxxx| 日韩av在线播放一区 | 毛片视频网址 | 精品伊人 | 91九色网| 国产jjizz一区二区三区视频 | 日本a∨精品中文字幕在线 被啪羞羞视频在线观看 | 欧美精品a∨在线观看不卡 午夜精品影院 | 久久国产精品区 | 在线成人免费视频 | 欧美日韩在线播放 | 亚洲精品com | 国产成人小视频在线观看 | 亚洲乱操 | 亚洲欧美在线视频免费 | 久久精品视频69 | 免费看毛片网站 | 欧美黄 片免费观看 | 日韩在线激情 | 少妇一级淫片免费看 | 国产午夜探花 | 久久羞羞 | 黄色网址免费在线播放 | av在线免费在线观看 | 亚洲一区二区三区四区精品 | 91精品国产九九九久久久亚洲 | 91麻豆精品国产91久久久点播时间 | 欧洲狠狠鲁 |