亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在SWIFT中,我們是否應該始終使用[自己不擁有的]內部封閉

在SWIFT中,我們是否應該始終使用[自己不擁有的]內部封閉

鴻蒙傳說 2019-06-24 13:41:34
在SWIFT中,我們是否應該始終使用[自己不擁有的]內部封閉在WWDC 2014會議上403中間SWIFT和成績單,有下面的幻燈片演講者說,如果我們不用[unowned self]在那里,這將是一個內存泄漏。這是否意味著我們應該一直使用[unowned self]內部關閉?在……上面ViewController.Swift天氣應用程序的第64行,我不使用[unowned self]..但是我使用一些@IBOutlet就像self.temperature和self.loadingIndicator..可能沒問題,因為@IBOutlets我定義的是weak..但是為了安全,我們是不是應該一直用[unowned self]?class TempNotifier {   var onChange: (Int) -> Void = {_ in }   var currentTemp = 72   init() {     onChange = { [unowned self] temp in       self.currentTemp = temp    }   }}
查看完整描述

3 回答

?
翻閱古今

TA貢獻1780條經驗 獲得超5個贊

不,肯定有你不想用的時候[unowned self]..有時,您希望閉包捕獲Self,以確保在調用閉包時它仍然存在。

示例:發出異步網絡請求

如果您正在發出異步網絡請求,則希望保留閉包self當請求完成時。否則,該對象可能已被解除分配,但您仍然希望能夠處理請求完成。

何時使用unowned selfweak self

你唯一想用的時間[unowned self][weak self]是當您創建一個強參考周期..一個強大的引用周期是當存在一個所有權循環時,對象最終相互擁有(可能通過第三方),因此它們永遠不會被釋放,因為它們都確保了彼此的存在。

在閉包的特定情況下,您只需要意識到在其中引用的任何變量都會被閉包“擁有”。只要閉包在附近,這些對象就一定會出現。阻止這種所有權的唯一方法是[unowned self][weak self]..因此,如果一個類擁有一個閉包,并且該閉包捕獲了對該類的強引用,那么在閉包和類之間有一個很強的引用周期。這還包括類是否擁有閉包的東西。

特別是在視頻的例子中

在幻燈片的例子中,TempNotifier通過onChange成員變量如果他們不宣布selfunowned,關閉也將擁有self創建一個強大的參考周期。

差異unownedweak

.之間的區別unownedweak那是weak聲明為可選時間。unowned不是。宣布weak你需要處理的情況是,它可能是零內關閉在某個時間點。如果您試圖訪問unowned變量碰巧為零,它將使整個程序崩潰。所以只能用unowned當您是正數時,當閉包出現時,該變量將始終存在。


查看完整回答
反對 回復 2019-06-24
?
交互式愛情

TA貢獻1712條經驗 獲得超3個贊

我想我應該為視圖控制器添加一些具體的例子。許多解釋,不僅僅是Stack溢出的解釋,真的很好,但我更好地處理了現實世界的例子(@drewag在這方面有了一個良好的開端):

  • 如果您有一個閉包來處理來自網絡請求的響應,請使用

    weak

    因為他們活得很久。視圖控制器可以在請求完成之前關閉

    self

    在調用閉包時不再指向有效對象。
  • 如果有處理按鈕上的事件的閉包。這可能是unowned因為一旦視圖控制器消失,按鈕和它可能引用的任何其他項就會從self同時離開。封閉區也會同時消失。

    class MyViewController: UIViewController {
          @IBOutlet weak var myButton: UIButton!
          let networkManager = NetworkManager()
          let buttonPressClosure: () -> Void // closure must be held in this class. 
    
          override func viewDidLoad() {
              // use unowned here          buttonPressClosure = { [unowned self] in
                  self.changeDisplayViewMode() // won't happen after vc closes. 
              }
              // use weak here          networkManager.fetch(query: query) { [weak self] (results, error) in
                  self?.updateUI() // could be called any time after vc closes          }
          }
          @IBAction func buttonPress(self: Any) {
             buttonPressClosure()
          }
    
          // rest of class below. }


查看完整回答
反對 回復 2019-06-24
  • 3 回答
  • 0 關注
  • 674 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號