[swift]-闭包解决循环引用的三种写法

1:定义一个闭包属性:也是须要初始化的时候给它初始化值,若是没有初始化值,就要把它声明成可选类型json

var callBack : ((jsonData : String) -> ())?

2:请求代码演示:swift

import UIKit

class HttpTools: NSObject {
    
    // 定义一个闭包属性:也是须要初始化的时候给它初始化值,若是没有初始化值,就要把它声明成可选类型
    var callBack : ((jsonData : String) -> ())?
    
    
    // 闭包的类型:(参数列表) -> (返回值类型)
    func loadData(callBack : (jsonData : String) -> ()) {
        
        self.callBack = callBack  
        
        dispatch_async(dispatch_get_global_queue(0, 0)) {
            print("发送网络请求\(NSThread.currentThread())")
            
            dispatch_sync(dispatch_get_main_queue(), { 
                print("获取到数据,而且进行回调:\(NSThread.currentThread())")
                callBack(jsonData: "jsonData数据===================")
                
            })
        }
    }

}

 

3:循环引用网络

> 写法之一: weak var weakSelf = self;闭包

// weakSelf可能保存一个内存地址,也可能保存一个空地址:0x0地址
        weak var weakSelf = self;
        tools.loadData { (jsonData) in
            // weakSef?.view :
            // 若是前面的可选类型,没有值,后面全部的代码都不会执行
            // 若是前面的可选类型有值,系统会自动将咱们的weakself进行解包,而且使用weakSelf
            weakSelf?.view.backgroundColor = UIColor.redColor()
}
 */

 

> 写法之二:优先推荐使用:多加了一个[weak self]:能够说是对第一种方式的简化版写法async

/*解决循环引用的方式二(推荐使用这种方式)
        // 这样写仅仅是对方式1的一种简化写法
        tools.loadData {[weak self] (jsonData) in
            print("拿到了json数据了:\(jsonData)")
            self?.view.backgroundColor = UIColor.redColor()
        }
*/

 

> 写法之三:比较危险,容易产生坏内存访问:就是对象销毁后原来的指针仍是指向原来的对象,产生野指针  [unowned self]ide

//解决循环引用的方式三
        tools.loadData {[unowned self] (jsonData) in
            print("拿到了json数据了:\(jsonData)")
            self.view.backgroundColor = UIColor.redColor()
 }

 

知识点补充:销毁方法spa

// deinit至关于oc中的dealloc方法,当对象销毁的时候会调用这个方法
    deinit{
        print("deinit---------");
    }

 

4:代码演示 :指针

import UIKit

class ViewController: UIViewController {
    
    // 建立属性的同时初始化对象
    var tools : HttpTools = HttpTools()
    
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        print("-----");
        
        /*解决循环引用的方式一
        // weakSelf可能保存一个内存地址,也可能保存一个空地址:0x0地址
        weak var weakSelf = self;
        tools.loadData { (jsonData) in
            print("拿到了json数据了:\(jsonData)")
            // weakSef?.view :若是前面的可选类型,没有值,后面全部的代码都不会执行
            // 若是前面的可选类型有值,系统会自动将咱们的weakself进行解包,而且使用weakSelf
            weakSelf?.view.backgroundColor = UIColor.redColor()
        }
        */
        
        
        
        /*解决循环引用的方式二(推荐使用这种方式)
        // 这样写仅仅是对方式1的一种简化写法
        tools.loadData {[weak self] (jsonData) in
            print("拿到了json数据了:\(jsonData)")
            self?.view.backgroundColor = UIColor.redColor()
        }
         */
        
        
        
        //解决循环引用的方式三
        tools.loadData {[unowned self] (jsonData) in
            print("拿到了json数据了:\(jsonData)")
            self.view.backgroundColor = UIColor.redColor()
        }
        
    }
    
    
    // deinit至关于oc中的dealloc方法,当对象销毁的时候会调用这个方法
    deinit{
        print("deinit---------");
    }
}

 

5:尾随闭包:若是闭包做为方法的最后一个参数,那么()能够省略掉code

三种写法:对象

> 普通写法:({

})

// 普通写法
        tools.loadData ({[weak self] (jsonData) in
            print("拿到了json数据了:\(jsonData)")
            self?.view.backgroundColor = UIColor.redColor()
        })

> 写法之一:(){

}

// 写法一
        tools.loadData () {[weak self] (jsonData) in
            print("拿到了json数据了:\(jsonData)")
            self?.view.backgroundColor = UIColor.redColor()
        }

> 写法之二:这是上面系统自动省略的那种方法

{

}

// 写法二:系统默认会省略掉()写法
        tools.loadData {[weak self] (jsonData) in
            print("拿到了json数据了:\(jsonData)")
            self?.view.backgroundColor = UIColor.redColor()
        }

 

 

 

 

意见反馈邮件:1415429879@qq.com 欢迎大家的阅读和赞扬、谢谢!

相关文章
相关标签/搜索