文档章节

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

XJDomain
 XJDomain
发布于 2016/08/01 17:50
字数 881
阅读 62
收藏 0

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

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

2:请求代码演示:

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]:可以说是对第一种方式的简化版写法

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

 

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

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

 

知识点补充:销毁方法

// 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:尾随闭包:如果闭包作为方法的最后一个参数,那么()可以省略掉

三种写法:

> 普通写法:({

})

// 普通写法
        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
欢迎你们的阅读和赞赏、谢谢!

 

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
XJDomain
粉丝 15
博文 112
码字总数 44060
作品 0
嘉定
高级程序员
私信 提问
Swift专题讲解十六——ARC在Swift中的应用

Swift专题讲解十六——ARC在Swift中的应用 一、引言 ARC(自动引用计数)是Objective-C和Swift中用于解决内存管理问题的方案。在学习Objective-C编程时经常会学习到一个关于ARC的例子:在一个...

珲少
2016/05/20
1K
1
Swift4.0基础知识回顾

简单介绍一下Swift Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序,Swift语言让应用开发更简单、更快、更稳定,确保最终应用有着更好的质量更多了解Swift可以去《The...

博行天下
2017/12/06
0
0
闭包的循环引用 与 解决(三种方法)

闭包的循环引用 与 解决(三种方法) // // // 闭包的循环引用 import UIKit class ViewController: UIViewController { // 定义完成回调属性 // 闭包的返回值可选 // var finishedCallBack:...

TaciturnKnightYQ
2015/12/04
144
0
Swift3.0 函数闭包与 Block

最近新接手了一个Swift项目,花点时间做点小结,以做记录 我的博客链接 Swift中定义一个基本函数 这里下划线 的作用用来忽略外部參数名,具体可以参考这篇文章 带参函数定义 举栗子,网络数据...

PetitBread
2017/06/08
0
0
[swift]-闭包前oc中block的说明

1:oc中blcok是一个匿名函数,常用于回调 2:oc中blcok的三种常见定义: 3:对于block中经常会注意循环引用的问题:最好的办法是使用weckself,常见写法: 3:使用内存图来判断是否循环引用了: ...

XJDomain
2016/08/01
6
0

没有更多内容

加载失败,请刷新页面

加载更多

手动回滚事物

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

素剑步青尘
8分钟前
0
0
jvm 运行参数归纳

-XX:autoBoxCacheMax 包装类型的缓存最大值参见:https://my.oschina.net/u/2552286/blog/2990515 -XX:autoBoxCacheMax=7777 -Xms256M -Xmx1024M 堆的初始内存与最大内存 在生产中,这两个值...

Canaan_
10分钟前
2
0
iOS 集成Facebook 第三方分享报错[FBSDKInternalUtility validateAppID]: failed for URL: "fbauth2:/" - error:

出现这种原因主要是因为info.plist文件里面没有添加一些配置文件

HOrange
15分钟前
1
0
轻松上云系列之二:其他云数据迁移至阿里云

本文档围绕如何将您其他云厂商上的数据迁移到阿里云,提供了多个场景的实践方案。 文档合集 AWS 数据迁移至阿里云 Amazon S3数据迁移到OSS 从AWS RDS迁移MySQL到阿里云RDS AWS S3迁移到OSS(...

阿里云官方博客
16分钟前
0
0
架构师的黄金证书---TOGAF

https://baijiahao.baidu.com/s?id=1590528955022289848&wfr=spider&for=pc

swingcoder
17分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部