swift-24閉包的循環(huán)引用

我以前做的swift筆記, 之前都是整理在onenote上, 最近想到整理出博客. 也方便自己查找, 可以當做自己的一份文檔.


import UIKit

class ViewController: UIViewController {
    //屬性 var 定義
    
    var completionCallBack: (()->())?

    override func viewDidLoad() {
        // 閉包如果出現(xiàn) self. 要特別小心
        // "循環(huán)"引用 單方向對引用是不會產生循環(huán)引用!
        // 只是閉包對self進行了copy 閉包執(zhí)行完成之后 會自動銷毀 同時釋放對self的引用
        // 同時需要 self 對閉包引用 才會形成循環(huán)引用
        // 'weak' must be a mutable variable, because it may change at runtime
        // weak 可能會被在運行時被修改 -> 指向的對象一旦被釋放 會被自動設置為nil
        /**
         循環(huán)引用 需要打斷鏈條
         法一 oc的方法
         */
        super.viewDidLoad()
//        weak var weakSelf = self
//        loadData {
//            /** 細節(jié)
//             ? 可選解包 如果 self已經被釋放 不會向對象發(fā)送getter的消息 更加安全 
//             ! 強行解包 如果 self已經被釋放 強行解包會導致奔潰
//            */
//            /**
//            weakSelf?.view 只是單純的發(fā)送消息 沒有計算
//             強行解包 因為需要計算 可選項不能直接參與到計算
//             */
//            //使用xcode8 的內存圖 
//            print(weakSelf!.view)
//            print(self.view)
//        }
        
        /**
         法二 swift的推薦方法
         與oc的 __weak typeof (self) weakSelf = self; 等效
         [weak self] 表示 {} 中的所有self 都是弱引用 需要注意解包
         */
        loadData { [weak self] in
            print(self?.view ?? "self被釋放")
        }
        
        /**
         法三 swift的另外一個用法 知道就好
         [unowned self] 表示 {} 中的所有 self都是assign的 不會強引用 但是 如果對象釋放 指針地址不會變化
         與oc的 __unsafe_unretained typeof (self) weakSelf = self; 等效
         如果對象被釋放 繼續(xù)調用 就會出現(xiàn)野指針的問題
         self 不要解包
         */
        loadData { [unowned self] in
            print(self.view ?? "self被釋放")
        }
        
    }

    func loadData(completion:@escaping ()->()) -> () {
        //使用屬性記錄閉包  self對閉包引用了
        completionCallBack = completion
        //異步
        DispatchQueue.global().async {
            print("耗時操作")
            DispatchQueue.main.async {
                //回調 執(zhí)行閉包
                completion()
            }
        }
    }

    deinit {
        print("揮手拜拜")
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容