您好,登錄后才能下訂單哦!
一、示例
由于閉包本質上也是引用類型,因此也可能在閉包和上下文捕獲變量(或常量)之間出現強引用類型,并不是所有的捕獲變量或常量都會發(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
//閉包體
}
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。