Swift 闭包使用(循环引用...)
class networkTool: NSObject {
//定义一个可选类型的闭包,用小括号()?括起闭包
var finishedCallBack2:((_ jsonData:String)->())?
/*
模拟数据请求,定义一个闭包
闭包类型:(参数列表)->(返回值类型)
@escaping 逃逸的,在非当前闭包内返回,需要使用@escaping
*/
func loadData(_ finishedCallBack:@escaping (_ jsonData:String)->()) {
self.finishedCallBack2=finishedCallBack
DispatchQueue.global().async {
print("打印当期线程\(Thread.current)")
DispatchQueue.main.sync {
print("打印当期线程\(Thread.current)")
finishedCallBack("json数据")
}
}
}
}
class ViewController: UIViewController {
var tool:networkTool?
override func viewDidLoad() {
super.viewDidLoad()
tool=networkTool()
}
@IBAction func onButtonAction0(_ sender: Any) {
//解决循环引用方案一:
//weak var weakSelf=self //使用weak变为弱引用
weak var weakSelf:ViewController?=self //注意如果weakSelf指定类型,一定为可选类型,因为释放之后指向nil
tool?.loadData({ (jsonData:String) in
print("请求到数据:\(jsonData)")
weakSelf?.view.backgroundColor=UIColor.red
})
}
func onButtonAction2(_ sender: Any) {
//解决循环引用方案二:使用[weak self] //推荐使用
tool?.loadData({[weak self] (jsonData:String) in
self?.view.backgroundColor=UIColor.red
})
}
func onButtonAction3(_ sender: Any) {
//解决循环引用方案二:使用[unowned self] //不推荐使用,如果销毁,会产生野指针错误
tool?.loadData({[unowned self] (jsonData:String) in
self.view.backgroundColor=UIColor.red
})
}
//尾随闭包的写法(不建议)
//如果在函数中,闭包是最后一个参数,那么可以写成尾随闭包
@IBAction func onButtonAction(_ sender: Any) {
/* //尾随闭包一
tool?.loadData(){[weak self] (jsonData:String) in
self?.view.backgroundColor=UIColor.red
}
*/
//尾随闭包二
//如果是唯一的参数,也可以将前面的()省略
tool?.loadData{[weak self] (jsonData:String) in
self?.view.backgroundColor=UIColor.red
}
}
deinit {
print("viewController -- deinit")
}
}
这是Swift的闭包中循环引用问题,同理OC中block的循环引用问题,请点击这里https://www.cnblogs.com/dhui69/p/11162125.html
Swift 闭包使用(循环引用...)的更多相关文章
- Swift 学习笔记 (解决Swift闭包中循环引用的三种方法)
话不多说 直接上代码 class SmartAirConditioner { var temperature:Int = //类引用了函数 var temperatureChange:((Int)-& ...
- swift中闭包的循环引用
首先我们先创造一个循环引用 var nameB:(()->())? override func viewDidLoad() { super.viewDidLoad() let bu = UIBu ...
- swift 学习之自动引用计数
swift 学习之自动引用计数 学习和研究的主要是"实例对象和实例对象直接的相会强引用所产生的内从泄漏"和"使用闭包产生的强引用造成的内存泄漏" 注意:只有以引 ...
- swift 闭包循环引用
当使用闭包时,类本身持有self,然后又在闭包中访问了self或者self的属性,就会导致恶心额循环引用.swift提供的解决方法是在闭包中定义捕获列表,捕获列表是闭包想怎么引用捕获来的变量.例如下面 ...
- swift闭包中解决循环引用的问题
swift中可以通过三种方法解决循环引用的问题 利用类似oc方法解决循环引用weak var weakSelf = self weak var weakSelf = self loadData = { ...
- Swift 学习笔记 (三) 之循环引用浅析
原创:转载请注明出处 110.自动引用计数实践 下面的例子展示了自动引用计数的工作机制.例子以一个简单的Person类开始,并定义了一个叫name的常量属性: class Person { l ...
- swift详解之九---------------自动引用计数、循环引用
自动引用计数.循环引用(这个必须理解,必须看) 注:本文详细介绍自动引用计数,以及各种循环引用问题.一网打尽! 1. 自动引用计数原理 Swift 使用ARC机制来跟踪和管理你的内存,一般情况下,Sw ...
- Swift入门(十)——循环引用、弱引用和无主引用
近期看到swift里面不仅有循环引用和弱引用(weak),还加入了无主引用(unowned),于是写了一些demo,这里总结一下. 和OC一样.Swfit默认也是基于ARC进行内存管理的,因此尽管简单 ...
- Swift 循环引用
- 循环引用的weak用法 // ** {} 中所有 self 都是弱引用,注意需要解包 // 1.类似于 OC 中的 __weak typeof(self) weakSelf = se ...
随机推荐
- Node.js npm基础安装配置&创建第一个VUE项目
使用之前,我们先来明白这几个东西是用来干什么的. node.js: 一种javascript的运行环境,能够使得javascript脱离浏览器运行.Node.js的出现,使得前后端使用同一种语言,统一 ...
- [Linux] day02——什么是Linux
什么是linux? 一种操作系统计算机 = 硬件 +软件系统软件 = 内核 + 驱动应用软件 编程 上网 linux系统构成linux内核基本库 应用程序-------------------常见的操 ...
- Spark教程——(3)编写spark-shell测试Demo
创建一个文件aa.txt,随便写点内容: hello world! aa aa d d dg g 登录HDFS文件系统: [root@node1 ~]# su hdfs 在HDFS文件系统中创建文件目 ...
- mysql设置timpstamp的默认值为 '0000-00-00 00:00:00' 时报错
问题:mysql设置timpstamp的默认值为 '0000-00-00 00:00:00' 时报错: ERROR 1067 (42000): Invalid default value for 'u ...
- 一、linux基础-对文件操作
1.1文件夹创建-复制-移动-重命名-删除1.创建文件夹mkdir zjbdir 2.复制文件/文件夹复制文件到:当前目录cp -r zjbdir zjbdir201600819复制文件到:当前目录 ...
- Kubernetes——滚动更新和数据管理
k8s——滚动更新滚动更新就是一次只更新一小部分副本,更新成功之后再更新更多的副本,最终完成所有副本的更新.滚动更新最大的好处是零停机,整个更新的过程中始终有副本运行,从而保证了业务的连续性.kube ...
- 083、Java数组之方法返回数组
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- python3列表操作
1.Python列表脚本操作符 2.Python列表截取 切片的公式:[start : end : step] 1)切片的取值: list1 = [1, 4, 9, 16, 25] print(lis ...
- php: 文件上传
1.主页: <!DOCTYPE html><html lang="en"><head> <meta charset="UT ...
- greenplum 数组操作
参考:http://gpdb.docs.pivotal.io/4390/admin_guide/query/topics/functions-operators.html Table 4. Advan ...