自從接觸了swift 之后,Closure 算是用的最多的東西了,為了避免循環(huán)引用,一直喜歡在Closure里面 使用 [unowned self] in這種方式,來避免這個問題。
然而
當(dāng)頁面存在網(wǎng)絡(luò)請求的時候!
在這里,我使用了Alamofire 和 MJRefresh 來請求數(shù)據(jù)和控制頁面刷新,且,tableView 被我搶解包了(這里這個tableView是必然存在的。。。頁面開始我就創(chuàng)建了它)
然后問題來了:當(dāng)網(wǎng)絡(luò)情況差的時候,頁面被銷毀,但是網(wǎng)絡(luò)請求并沒有被取消,然后網(wǎng)絡(luò)數(shù)據(jù)下來之后,繼續(xù)執(zhí)行了Closure,此時程序崩潰,因為self已經(jīng)不在了。
參考了Swift:Weak 和 Unowned之后,
解決方案:
將[unowned self] 改為了 [weak self] 避免強制解包
不靠譜的分析
大概是unowned 捕獲的對象不是Option 類型的對象,unowned 必須要求對象必須提前創(chuàng)建, 并和Closure 擁有相同的生命周期才可以有效的避免強制解包!