第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

在SWIFT中,我們是否應(yīng)該始終使用[自己不擁有的]內(nèi)部封閉

在SWIFT中,我們是否應(yīng)該始終使用[自己不擁有的]內(nèi)部封閉

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

3 回答

?
翻閱古今

TA貢獻(xiàn)1780條經(jīng)驗 獲得超5個贊

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

示例:發(fā)出異步網(wǎng)絡(luò)請求

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

何時使用unowned selfweak self

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

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

特別是在視頻的例子中

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

差異unownedweak

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


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

TA貢獻(xiàn)1712條經(jīng)驗 獲得超3個贊

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

  • 如果您有一個閉包來處理來自網(wǎng)絡(luò)請求的響應(yīng),請使用

    weak

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

    self

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

    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. }


查看完整回答
反對 回復(fù) 2019-06-24
  • 3 回答
  • 0 關(guān)注
  • 685 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號