閉包的循環(huán)引用

建立NetworkTools對(duì)象

class NetworkTools: NSObject {

    /// 加載數(shù)據(jù)
    ///
    /// - parameter finished: 完成回調(diào)
    func loadData(finished: () -> ()) {
        print("開(kāi)始加載數(shù)據(jù)...")

        // ...
        finished()
    }

    deinit {
        print("網(wǎng)絡(luò)工具 88")
    }
}

實(shí)例化NetworkTools并且加載數(shù)據(jù)

class ViewController: UIViewController {

    var tools: NetworkTools?

    override func viewDidLoad() {
        super.viewDidLoad()

        tools = NetworkTools()
        tools?.loadData() {
            print("come here \(self.view)")
        }
    }

    /// 與 OC 中的 dealloc 類似,注意此函數(shù)沒(méi)有()
    deinit {
        print("控制器 88")
    }
}
  • 運(yùn)行時(shí)不會(huì)造成循環(huán)引用,因?yàn)?code>loadData執(zhí)行完畢后,就會(huì)釋放對(duì) self 的引用

修改NetworkTools,定義回調(diào)閉包屬性

/// 完成回調(diào)屬性
var finishedCallBack: (()->())?

/// 加載數(shù)據(jù)
///
/// - parameter finished: 完成回調(diào)
func loadData(finished: () -> ()) {

    self.finishedCallBack = finished

    print("開(kāi)始加載數(shù)據(jù)...")

    // ...
    working()
}

func working() {
    finishedCallBack?()
}

deinit {
    print("網(wǎng)絡(luò)工具 88")
}
  • 運(yùn)行測(cè)試,會(huì)出現(xiàn)循環(huán)引用

解除循環(huán)引用

  • 與OC類似方法
/// 類似于 OC 的解除引用
func demo() {
    weak var weakSelf = self
    tools?.loadData() {
        print("\(weakSelf?.view)")
    }
}
  • Swift推薦方法
loadData { [weak self] in
    print("\(self?.view)")
}
  • 還可以
loadData { [unowned self] in
    print("\(self.view)")
}

閉包(block)的循環(huán)引用小結(jié)

  • Swift

    • [weak self]
      • self 是可選項(xiàng), 如果self已經(jīng)被釋放,則為nil
    • [unowned self]
      • self 不是可選項(xiàng), 如果self已經(jīng)被釋放,則會(huì)出現(xiàn) 野指針訪問(wèn)
  • Objc

    • __weak typeof(self) weakSelf;
      • 如果self已經(jīng)被釋放,則為nil
    • __unsafe_unretained typeof(self) weakSelf;
      • 如果self已經(jīng)被釋放,則出現(xiàn)野指針訪問(wèn)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.閉包的循環(huán)引用 //Created by zhangmi on 15/2/28.//Copyright ? 2...
    i愛(ài)吃土豆的貓閱讀 163評(píng)論 0 0
  • Swift閉包和OC的block一樣,只要是內(nèi)部的變量都會(huì)加上一個(gè)strong的強(qiáng)引用 /*解決循環(huán)引用三種方法 ...
    豎著走的大閘蟹閱讀 598評(píng)論 1 0
  • 類似于OC的block,swift閉包中也存在循環(huán)引用的問(wèn)題,通常解決閉包中循環(huán)引用的方式有以下三種(1)方式一:...
    小碼碼閱讀 395評(píng)論 0 0
  • 1.什么時(shí)候會(huì)發(fā)生循環(huán)引用 原理跟OC中的block類似, 當(dāng)有個(gè)屬性記錄下了函數(shù)傳遞回來(lái)的閉包, 產(chǎn)生強(qiáng)引用, ...
    GoGooGooo閱讀 9,083評(píng)論 0 7
  • 喵喵]正如別人說(shuō)的“現(xiàn)在的男人對(duì)我來(lái)說(shuō),是沒(méi)用的。因?yàn)殄X我會(huì)掙,地我會(huì)掃,飯我會(huì)做,架我會(huì)打,街我會(huì)逛。要是有個(gè)男...
    762420323753閱讀 124評(píng)論 0 0

友情鏈接更多精彩內(nèi)容