文档章节

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

XJDomain
 XJDomain
发布于 2016/08/01 17:50
字数 881
阅读 55
收藏 0
点赞 0
评论 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语法学习

变量和常量 变量,可以修改的 常量,一经定义不能修改 在swift开发中,通常先定义常量,只有必须修改的时候,再改成 注意点: swift是一个对变量类型要求及其严格的语言 任何数据类型之间,都...

冷漠叻荭颜 ⋅ 2015/05/10 ⋅ 1

Swift专题讲解十六——ARC在Swift中的应用

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

珲少 ⋅ 2016/05/20 ⋅ 1

Swift4.0基础知识回顾

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

博行天下 ⋅ 2017/12/06 ⋅ 0

闭包的循环引用 与 解决(三种方法)

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

TaciturnKnightYQ ⋅ 2015/12/04 ⋅ 0

Swift3.0 函数闭包与 Block

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

PetitBread ⋅ 2017/06/08 ⋅ 0

Swift3.0 闭包(blcok)的全面介绍及使用

闭包是自包含的函数代码块,可以在代码中被传递和使用。Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的匿名函数比较相似。闭包可以捕获和存储其所在上下文...

啪神 ⋅ 2016/12/28 ⋅ 0

[Swift开发者必备Tips]内存管理

来自王巍大喵的电子书,第四版(应该是目前为止更新的最新版了),花了一周早餐钱给买了,在这盗版横行的年代,我们的支持是作者继续更新和完善本书的动力,虽然大大不怎么缺钱.... 文章旨在记...

PetitBread ⋅ 2017/12/06 ⋅ 0

Swift中如何解决循环引用问题?

  和OC一样,swift开发中也是使用自动引用计数ARC(Auto Reference Counteting)来自动管理内存的,所以我们不需要过多考虑内存管理.当某个类实例不需要用到的时候,ARC会自动释放其占用的内存....

天使爱美 ⋅ 2016/11/04 ⋅ 0

闭包的循环引用 与 解决(三种方法)

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

TaciturnKnightYQ ⋅ 2015/12/04 ⋅ 0

swift基本语法

1.常量和变量 定义一个常量:let 常量初始化赋值后 不能再次赋值 定义一个变量:var 赋值后 可以在此修改 后面一定要修改 否则选择let 2.Swift有数据类型推导 根据后面的值直接推出来的类型(...

KevinEmily ⋅ 2016/03/05 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

js模拟栈和队列

栈和队列 栈:LIFO(先进后出)一种数据结构 队列:LILO(先进先出)一种数据结构 使用的js方法 1.push();可以接收任意数量的参数,把它们逐个推进队尾(数组末尾),并返回修改后的数组长度。 2....

LIAOJIN1 ⋅ 14分钟前 ⋅ 0

180619-Yaml文件语法及读写小结

Yaml文件小结 Yaml文件有自己独立的语法,常用作配置文件使用,相比较于xml和json而言,减少很多不必要的标签或者括号,阅读也更加清晰简单;本篇主要介绍下YAML文件的基本语法,以及如何在J...

小灰灰Blog ⋅ 22分钟前 ⋅ 0

IEC60870-5-104规约传送原因

1:周期循环2:背景扫描3:自发4:初始化5:请求6:激活7:激活确认8:停止激活9:停止激活确认10:激活结束11:远程命令引起的返送信息12:当地命令引起的返送信息13:文件传送20:响应总召...

始终初心 ⋅ 35分钟前 ⋅ 0

【图文经典版】冒泡排序

1、可视化排序过程 对{ 6, 5, 3, 1, 8, 7, 2, 4 }进行冒泡排序的可视化动态过程如下 2、代码实现    public void contextLoads() {// 冒泡排序int[] a = { 6, 5, 3, 1, 8, 7, 2, ...

pocher ⋅ 45分钟前 ⋅ 0

ORA-12537 TNS-12560 TNS-00530 ora-609解决

oracle 11g不能连接,卡住,ORA-12537 TNS-12560 TNS-00530 TNS-12502 tns-12505 ora-609 Windows Error: 54: Unknown error 解决方案。 今天折腾了一下午,为了查这个问题。。找了N多方案,...

lanybass ⋅ 59分钟前 ⋅ 0

IDEA反向映射Mybatis

1.首先在pom文件的plugins中添加maven对mybatis-generator插件的支持 ` <!-- mybatis逆向工程 --><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-ma......

lichengyou20 ⋅ 今天 ⋅ 0

4.10/4.11/4.12 lvm讲解 4.13 磁盘故障小案例

准备磁盘分区 fdisk /dev/sdb n 创建三个新分区,分别1G t 改变分区类型为8e 准备物理卷 pvcreate /dev/sdb1 pvcreate /dev/sdb2 pvcreate /dev/sdb3 pvdisplay/pvs 列出当前的物理卷 pvremo...

Linux_老吴 ⋅ 今天 ⋅ 0

zabbix 3.4安装

#已装好lamp环境 1.安装相关yum仓库 rpm -i http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm #tip:rpm -ql zabbix-release 看上面这个软件装了哪些东......

山月关 ⋅ 今天 ⋅ 0

Java的Excel导出工具类

首先在POM中引入需要的Jar <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency><dependency><groupId>o......

Kxvz ⋅ 今天 ⋅ 0

springboot 使用jsp

目录结构: 启动文件的Application必须在contorller文件的父级 文件路径在src/main/webapp下面 我的配置:前缀是/WEB-INF/jsp/ pom.xml需要加入tomcat-embed-jasper, 对jsp的支持的依赖 <de...

夜醒者 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部