swift3.0 - 闭包

2016-08-11  本文已影响370人  07212a79db66

闭包的介绍

函数是闭包的一种
类似于OC语言的block
闭包表达式(匿名函数) -- 能够捕获上下文中的值

语法: in关键字的目的是便于区分返回值和执行语句
闭包表达式的类型和函数的类型一样, 是参数加上返回值, 也就是in之前的部分
{
(参数) -> 返回值类型 in
执行语句
}

闭包简写

闭包使用:使用闭包代替block

class HttpRequestTool: NSObject {

    var callBack:(()->())?
    
    func loadData(callBack: () -> ()) {
        
        self.callBack = callBack
        DispatchQueue.global(attributes: DispatchQueue.GlobalAttributes(rawValue: UInt64(0))).async {
            print("网络请求数据:", Thread.current())
            DispatchQueue.main.async(execute: {
                callBack()
            })
        }
    }  
}

class ViewController: UIViewController {

    var httpTools : HttpRequestTool = HttpRequestTool()
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
     
        httpTools.loadData { 
            print("加载数据完成,更新界面:", Thread.current())
        }
        
    } 
}

闭包的循环引用

在xcode8可以利用内存图分析循环引用:
例如:这样写会造成循环引用


httpTools.loadData { 
            print("load data finish")
            self.view.backgroundColor = UIColor.red()
        }
        
        deinit {
        print("控制器销毁了")
    }
        

通过内存分析图查看表现为:

绿色的为出现循环引用.并且没用打印控制器销毁.改为如下代码:

weak var weakSelf = self
        httpTools.loadData { 
            print("load data finish")
            weakSelf?.view.backgroundColor = UIColor.red()
        }
        
        deinit {
        print("控制器销毁了")
    }

通过内存分析图查看表现为:

绿色消除,打印控制器销毁

// 析构函数(相当于OC中dealloc方法)
    deinit {
        print("ViewController----deinit")
    }
    

swift中解决循环引用的方式


 weak var weakSelf = self
        httpTools.loadData { 
            print("load data finish")
            weakSelf?.view.backgroundColor = UIColor.red()
        }
        

httpTools.loadData {[weak self] () -> () in
            print("load data finish")
            self?.view.backgroundColor = UIColor.red()
     }
     
 httpTools.loadData {[unowned self] () -> () in
            print("load data finish")
            self.view.backgroundColor = UIColor.red()
        }
上一篇 下一篇

猜你喜欢

热点阅读