一、示例

由于闭包本质上也是引用类型,因此也可能在闭包和上下文捕获变量(或常量)之间出现强引用类型,并不是所有的捕获变量或常量都会发生强引用循环问题,只有将一个闭包赋值给对象的某个属性,并且这个闭包体使用了该对象,才会产生闭包强引用循环

classEmployee{varno:IntvarfirstName:StringvarlastName:Stringvarjob:Stringvarsalary:Doubleinit(no:Int,firstName:String,lastName:String,job:String,salary:Double){self.no=noself.firstName=nameself.lastName=nameself.job=jobself.salary=salaryprintln("员工\(firstName)已经构造成功")}deinit{println("员工\(firstName)已经析构成功")}lazyvarfullName:()->String={returnself.firstName+"."+self.lastName}}varemp:Employee?=Employee(no:10,firstName:"tom",lastName:"chen",job:"IT",salary:1000.0)println(emp!.fullName())emp=nil


二、解决闭包中的强引用循环


解决闭包强引用循环问题有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

//闭包体

}