閉包引起的循環(huán)引用問(wèn)題

閉包的內(nèi)存管理

  • 為什么蘋果要區(qū)分逃逸閉包和非逃逸閉包類,當(dāng)然是從性能優(yōu)化上考慮的。上篇文章我們說(shuō)非逃逸閉包的作用域是在函數(shù)體內(nèi)那函數(shù)結(jié)束后,函數(shù)體臨時(shí)數(shù)據(jù)都會(huì)釋放掉,對(duì)于逃逸閉包,作用域超過(guò)了函數(shù)體,那它為了防止被釋放掉,它就會(huì)把自己復(fù)制一份。這樣如果你在閉包里訪問(wèn)了當(dāng)前對(duì)象的屬性或者方法,那么這個(gè)閉包就對(duì)這個(gè)對(duì)象強(qiáng)引用,要是處理不當(dāng)就會(huì)出現(xiàn)循環(huán)引用的危險(xiǎn)(如果恰巧這個(gè)對(duì)象也強(qiáng)引用了這個(gè)閉包)。下面我們就研究一下下循環(huán)引用如何出現(xiàn)的。

class Person: NSObject {
    var name: String?
    var age: Int?
    var changName: (() -> ())?
    
    init(name: String?, age: Int?) {
        self.name = name
        self.age = age
    }
}

let p1 = Person(name: "Bill", age: 15)

p1.changName = { Void in
    print(p1.name ?? "Bill")
}

p1.changName!()

  • 我們看到P1對(duì)閉包進(jìn)行了強(qiáng)引用,然后閉包里又使用了p1.name這樣閉包又對(duì)p1進(jìn)行了一次強(qiáng)引用
QQ20170316-152929@2x.png
  • 如何解決這種強(qiáng)引用類,我們要使用[weak 該引用對(duì)象]

p1.changName = {[weak p1] Void in
    print(p1?.name ?? "Bill")
}

p1.changName!()

QQ20170316-153027@2x.png

*來(lái)畫個(gè)牛逼的圖看看

QQ20170316-154213@2x.png
  • 總上所屬不是閉包里一定要使用[weak ],而是你要看看這個(gè)閉包里使用了該對(duì)象的屬性和方法沒(méi),如果使用了對(duì)不起,您造成了循環(huán)引用,請(qǐng)?zhí)幚怼H绻榭错?xiàng)目是否有循環(huán)引用的問(wèn)題。請(qǐng)自行百度吧!

造成循環(huán)引用的還有其他幾種情況,解決循環(huán)引用的方法也不止這一種,有時(shí)間寫一篇介紹循環(huán)引用的文章吧

下節(jié)傳送門

最后編輯于
?著作權(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)容

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