Swift中closure的循環(huán)引用記錄

1、定義一個(gè)controller: TestController并添加如下代碼

class TestController: UIViewController {
    
    typealias TestClosure = () -> ()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
    }

    deinit {
        print(self, #function)
    }
    
    // MARK: - private property
    private var name: String = "sdf"
    private var closure: TestClosure?
}




然后添加方法進(jìn)行測(cè)試:

  • 1
func test() {
        
        let closure: TestClosure = {
            self.name = ""
        }
        
        closure()
    }

不會(huì)循環(huán)引用

 closure引用了name,但是 self 沒有引用closure,
 不構(gòu)成互相強(qiáng)引用的關(guān)系


  • 2
    func test2() {
        
        let closure: TestClosure = {
            self.name = ""
        }
        
        closure()
        self.closure = closure
    }

會(huì)

closure引用了name,self 也引用closure,
構(gòu)成互相強(qiáng)引用的關(guān)系


  • 3
    func test3() {
        
        let closure: TestClosure = {[weak self] in
            
            let closure1: TestClosure = {
                self?.name = "dddd"
            }
            closure1()
        }
        
        closure()
        self.closure = closure
    }

不會(huì)

closure中使用了[weak self] 修飾,所以在整個(gè)closure中的self都是弱引用,
雖然在closure1中并沒有用[weak self]關(guān)鍵字,但是他此時(shí)調(diào)用的self是closure中的弱引用self
所以沒有構(gòu)成循環(huán)引用


  • 4
    func test4() {
        
        let closure: TestClosure = {
            
            let closure1: TestClosure = { [weak self] in
                self?.name = "dddd"
            }
            closure1()
        }
        
        closure()
        self.closure = closure
    }

會(huì)

closure中并沒有使用了[weak self] 修飾,所以在整個(gè)closure中的self都是強(qiáng)引用,
雖然在closure1中并有用[weak self]關(guān)鍵字,但是他此時(shí)調(diào)用的self是closure中的強(qiáng)引用self
所以有構(gòu)成循環(huán)引用


結(jié)論:

如果在closure引用了self.但是self不引用closure,此時(shí)不會(huì)發(fā)生循環(huán)引用
如果self還引用了closure,這個(gè)時(shí)候就需要[weak self] 或者 [unowned self] 去修飾
如果有多層的closure嵌套,要在最外層的closure中修飾self,否則會(huì)發(fā)生循環(huá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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學(xué)習(xí)記錄文檔,今天18年5月份再次想寫文章,發(fā)現(xiàn)簡(jiǎn)書還為我保存起的...
    Jenaral閱讀 3,146評(píng)論 2 9
  • 作為一門現(xiàn)代的高級(jí)編程語言,Swift代替我們進(jìn)行了對(duì)象的創(chuàng)建和銷毀等相關(guān)的內(nèi)存管理。它使用了一個(gè)優(yōu)雅的技術(shù),叫做...
    Maru閱讀 2,306評(píng)論 4 17
  • Swift使用ARC(自動(dòng)引用計(jì)數(shù)器:Automatic Reference Counting)來追蹤和管理應(yīng)用的...
    WSJay閱讀 2,300評(píng)論 0 3
  • 一早起來陪朱宏打籃球,我也穿上運(yùn)動(dòng)鞋在奧體跑步。跑步的人不少,運(yùn)動(dòng)氛圍濃厚,我走了兩圈后才跑。看到其他人運(yùn)動(dòng)的那股...
    李丁梅閱讀 137評(píng)論 2 2
  • 顛倒陰陽下的失眠,就像女人平靜的說男人不行,男人冷漠的說女人臟,路人問候你祖宗十八代一樣讓人難過。失眠很難受,...
    孤燈邪影閱讀 360評(píng)論 0 0

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