Swift3.0 解除循環(huán)引用

此文章延續(xù)上一篇(循環(huán)引用)進行說明的,有想了解的騷年請點擊 http://www.itdecent.cn/p/d248ecb00be7

class ViewController: UIViewController {

    //創(chuàng)建一個屬性
    var completionCallBack:(()->())?
    
    override func viewDidLoad()
    {
        super.viewDidLoad()
        
        //在block中如果出現(xiàn)self. 需要注意
        //循環(huán)引用,單方向是不會產(chǎn)生引用的
        //只是閉包對slef執(zhí)行了copy,閉包執(zhí)行完成后會自動銷毀,同時釋放對self的引用
        //如果要循環(huán)應(yīng)用,在閉包的同時用self引用
        
        //解除循環(huán)應(yīng)引用,需要打斷鏈條
        
//        //方法一 : OC方式
//        //為什么此處使用var,因為此對象可能在運行時被修改,如若使用let則報錯
//        //weak只能修飾 var , 不能修飾 let
//        //weak指向的對象一但被釋放,會自動設(shè)置成 nil ,而改變了指針地址
//        weak var weakSelf = self
//        
//        LoadData {
//            
//            /*解包有兩種方式
//             ' ? ' 為可選解包   - 如果 self 已經(jīng)被釋放,不會向?qū)ο蟀l(fā)送 getter 消息,此方法更加安全
//             ' ! ' 為強行解包    - 如果 self 已經(jīng)被釋放 , 強行解包會導(dǎo)致崩潰
//             
//             weakSelf?.view - 只是單純的發(fā)送消息,沒有計算
//             強行解包, 因為需要計算, 可選項不能直接參與到計算
//            */
//            print(weakSelf?.view)
//            print(self.view)
//        }
        
        //方法二 :  Swift 方法 (推薦方法)            同OC的__weak
        // [weak self] 表示閉包中所有的self都是弱引用,需要注意解包
        LoadData { [weak self] in
            print(self?.view)
        }
        
//        //方法三 : Swift 另外一個方法      同OC的__unsafe_unretained
//        //[unowned self] 表示閉包中所有 self 都是assign 的,不會強引用,但是如果對象釋放,指針地址不會變
//        //如果對象被釋放,再繼續(xù)調(diào)用會出現(xiàn)野指針
//        LoadData { [unowned self] in
//            print(self.view)
//        }
    }
    
    func LoadData(completion:() ->()) -> ()
    {
        //使用屬性記錄閉包 -> self對閉包引用了
        completionCallBack = completion
        
        //異步
        DispatchQueue.global().async {
            
            print("耗時操作")
            
            Thread.sleep(forTimeInterval :2)       

            DispatchQueue.main.async{
                
                //回調(diào) 執(zhí)行閉包
                completion()
            }
        }
    }
    
    //類似OC的dealloc
    deinit {
        print("走了")         //如果不寫此句則不會循環(huán)引用 completionCallBack = completion,此方法執(zhí)行
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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