溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

閉包中的強引用循環(huán)

發(fā)布時間:2020-07-11 20:19:35 來源:網絡 閱讀:388 作者:hehemmm 欄目:開發(fā)技術

一、示例

        由于閉包本質上也是引用類型,因此也可能在閉包和上下文捕獲變量(或常量)之間出現強引用類型,并不是所有的捕獲變量或常量都會發(fā)生強引用循環(huán)問題,只有將一個閉包賦值給對象的某個屬性,并且這個閉包體使用了該對象,才會產生閉包強引用循環(huán)

        class Employee {
                var no:Int 
                var firstName:String
                var lastName:String
                var job:String
                var salary:Double
                
                init(no:Int,firstName:String,lastName:String,job:String,salary:Double){
                            self.no = no
                            self.firstName = name
                            self.lastName = name
                            self.job = job
                            self.salary = salary
                            println("員工\(firstName)已經構造成功")
    }
                deinit{
                            println("員工\(firstName)已經析構成功")
    }
                            lazy var fullName:()->String = {
                                        return self.firstName + "." + self.lastName
    }
}        
        var emp:Employee? = Employee(no:10,firstName:"tom",lastName:"chen",job:"IT",salary:1000.0)
        println(emp!.fullName())
        emp = nil


二、解決閉包中的強引用循環(huán)


        解決閉包強引用循環(huán)問題有2種方法:弱引用和無主引用,到底應該采用弱引用還是無主引用,與2個對象之間的選擇條件是一樣的,如果閉包和捕獲的對象總是互相引用和同時銷毀,即將閉包內的聲明為無主引用,當捕獲的對象有時可能為nil時,即將閉包內的捕獲聲明為弱引用,如果捕獲的對象絕對不會為nil時,那么應該采用無主引用

        

        1、普通的格式

        lazy var 閉包:<閉包參數列表>-><閉包返回值>={

                [unowned捕獲對象]<閉包參數列表>-><返回值類型> in 

                或[weak 捕獲對象]<閉包參數列表>-><返回值類型> in

}

            示例


        lazy var fullName:()->String = {

        [weak self](firstName:String,lastName:String)->String in 

                //閉包體

}


        2、縮寫格式


        lazy var 閉包:<閉包參數列表>-><閉包返回值>={

                [unowned捕獲對象] in 

                或[weak 捕獲對象] in

                    //閉包體

}


        示例


        lazy var fullName:()->String = {

        [weak self]  in 

                //閉包體

}


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI