解析Swift中閉包的循環(huán)引用

1.什么時(shí)候會(huì)發(fā)生循環(huán)引用

原理跟OC中的block類似, 當(dāng)有個(gè)屬性記錄下了函數(shù)傳遞回來的閉包, 產(chǎn)生強(qiáng)引用, 就會(huì)發(fā)生閉包的循環(huán)引用

2.怎么解決循環(huán)引用

如何解決閉包的循環(huán)引用, 同樣有三種方式:

  • 使用weak修飾變量, 打破強(qiáng)引用, 因?yàn)槭褂脀eak修飾的變量有一次變成nil的機(jī)會(huì)

  • 使用[weak self] 修飾閉包原理跟__weak類似, 這樣在閉包中使用self, 就是弱引用

  • 使用[unowned self ] 修飾閉包, 跟__unsafe_unretained類似, 不安全

3.如何判斷是否發(fā)生強(qiáng)引用, 閉包中使用析構(gòu)函數(shù)

//swift dealloc

//析構(gòu)函數(shù)

deinit{

print("銷毀")

}
  • storyboard:
748058-f7ffe3d95b622696.png

4.Swift中的代碼

import UIKit

class ViewController: UIViewController {
    var finishedCallBack: ( (dataString: String) -> () )?
    override func viewDidLoad() {
        super.viewDidLoad()

//解決方式三: [unowned self]  跟 _unsafe_unretained 類似  不推薦使用 
        loadData { [unowned self] (dataString) -> () in
            print("\(dataString) \(self.view)")
        }  
    }

    func method2() {
        //解決方式二:  在swift中 有特殊的寫法 ,跟OC __weak 相似  [weak self]
        loadData { [weak self] (dataString) -> () in

            //以后在閉包中中 使用self 都是若引用的
            print("\(dataString) \(self?.view)")
        }
    }

    func method1() {
        // 解決方式一: weak
        weak var weakSelf = self
        loadData { (dataString) -> () in
            print("\(dataString) \(weakSelf?.view)")
        }
    }


    func loadData(finished: (dataString: String) -> ()) {

        // 記錄閉包
        self.finishedCallBack = finished
        //加載數(shù)據(jù)
        dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in

            print("執(zhí)行耗時(shí)操作")

            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                //執(zhí)行回調(diào)
                self.working()
            })
        }
    }


    func working() {
        self.finishedCallBack?(dataString: "<html>")
    }

    //swift dealloc
    //析構(gòu)函數(shù)
    deinit {
        print("銷毀")
    }
}
最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 1.什么時(shí)候會(huì)發(fā)生循環(huán)引用 原理跟OC中的block類似, 當(dāng)有個(gè)屬性記錄下了函數(shù)傳遞回來的閉包, 產(chǎn)生強(qiáng)引用, ...
    鄰家菇?jīng)?/span>閱讀 9,118評(píng)論 10 8
  • 在上一篇文章Swift中的變量和常量中我總結(jié)了一些自己對(duì)于變量和常量的認(rèn)識(shí),最近學(xué)習(xí)了閉包,順便給大家分享一下關(guān)于...
    老板娘來盤一血閱讀 18,893評(píng)論 16 87
  • 作為一門現(xiàn)代的高級(jí)編程語言,Swift代替我們進(jìn)行了對(duì)象的創(chuàng)建和銷毀等相關(guān)的內(nèi)存管理。它使用了一個(gè)優(yōu)雅的技術(shù),叫做...
    Maru閱讀 2,315評(píng)論 4 17
  • 類實(shí)例之間的循環(huán)強(qiáng)引用 下面展示了一個(gè)不經(jīng)意產(chǎn)生循環(huán)強(qiáng)引用的例子。例子定義了兩個(gè)類:Person和Apartmen...
    wu大維閱讀 2,435評(píng)論 6 10
  • 所謂的修行, 涵養(yǎng), 往往就是 打死你我也不說。
    再湊熱鬧閱讀 99評(píng)論 0 0

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