闭包中的强引用循环-创新互联

一、示例

创新互联是一家集网站建设,点军企业网站建设,点军品牌网站建设,网站定制,点军网站建设报价,网络营销,网络优化,点军网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

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

        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

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

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

               //闭包体

}

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


网页名称:闭包中的强引用循环-创新互联
URL分享:http://ybzwz.com/article/cejsss.html