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 闭包使用(循环引用...)的更多相关文章

  1. Swift 学习笔记 (解决Swift闭包中循环引用的三种方法)

    话不多说 直接上代码 class SmartAirConditioner { var temperature:Int = //类引用了函数 var temperatureChange:((Int)-& ...

  2. swift中闭包的循环引用

    首先我们先创造一个循环引用 var nameB:(()->())? override func viewDidLoad() { super.viewDidLoad() let bu = UIBu ...

  3. swift 学习之自动引用计数

    swift 学习之自动引用计数 学习和研究的主要是"实例对象和实例对象直接的相会强引用所产生的内从泄漏"和"使用闭包产生的强引用造成的内存泄漏" 注意:只有以引 ...

  4. swift 闭包循环引用

    当使用闭包时,类本身持有self,然后又在闭包中访问了self或者self的属性,就会导致恶心额循环引用.swift提供的解决方法是在闭包中定义捕获列表,捕获列表是闭包想怎么引用捕获来的变量.例如下面 ...

  5. swift闭包中解决循环引用的问题

    swift中可以通过三种方法解决循环引用的问题 利用类似oc方法解决循环引用weak var weakSelf = self weak var weakSelf = self loadData = { ...

  6. Swift 学习笔记 (三) 之循环引用浅析

    原创:转载请注明出处 110.自动引用计数实践 下面的例子展示了自动引用计数的工作机制.例子以一个简单的Person类开始,并定义了一个叫name的常量属性: class Person {     l ...

  7. swift详解之九---------------自动引用计数、循环引用

    自动引用计数.循环引用(这个必须理解,必须看) 注:本文详细介绍自动引用计数,以及各种循环引用问题.一网打尽! 1. 自动引用计数原理 Swift 使用ARC机制来跟踪和管理你的内存,一般情况下,Sw ...

  8. Swift入门(十)——循环引用、弱引用和无主引用

    近期看到swift里面不仅有循环引用和弱引用(weak),还加入了无主引用(unowned),于是写了一些demo,这里总结一下. 和OC一样.Swfit默认也是基于ARC进行内存管理的,因此尽管简单 ...

  9. Swift 循环引用

    - 循环引用的weak用法 // ** {} 中所有 self 都是弱引用,注意需要解包        // 1.类似于 OC 中的 __weak typeof(self) weakSelf = se ...

随机推荐

  1. Node.js npm基础安装配置&创建第一个VUE项目

    使用之前,我们先来明白这几个东西是用来干什么的. node.js: 一种javascript的运行环境,能够使得javascript脱离浏览器运行.Node.js的出现,使得前后端使用同一种语言,统一 ...

  2. [Linux] day02——什么是Linux

    什么是linux? 一种操作系统计算机 = 硬件 +软件系统软件 = 内核 + 驱动应用软件 编程 上网 linux系统构成linux内核基本库 应用程序-------------------常见的操 ...

  3. Spark教程——(3)编写spark-shell测试Demo

    创建一个文件aa.txt,随便写点内容: hello world! aa aa d d dg g 登录HDFS文件系统: [root@node1 ~]# su hdfs 在HDFS文件系统中创建文件目 ...

  4. mysql设置timpstamp的默认值为 '0000-00-00 00:00:00' 时报错

    问题:mysql设置timpstamp的默认值为 '0000-00-00 00:00:00' 时报错: ERROR 1067 (42000): Invalid default value for 'u ...

  5. 一、linux基础-对文件操作

    1.1文件夹创建-复制-移动-重命名-删除1.创建文件夹mkdir zjbdir 2.复制文件/文件夹复制文件到:当前目录cp -r zjbdir  zjbdir201600819复制文件到:当前目录 ...

  6. Kubernetes——滚动更新和数据管理

    k8s——滚动更新滚动更新就是一次只更新一小部分副本,更新成功之后再更新更多的副本,最终完成所有副本的更新.滚动更新最大的好处是零停机,整个更新的过程中始终有副本运行,从而保证了业务的连续性.kube ...

  7. 083、Java数组之方法返回数组

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  8. python3列表操作

    1.Python列表脚本操作符 2.Python列表截取 切片的公式:[start : end : step] 1)切片的取值: list1 = [1, 4, 9, 16, 25] print(lis ...

  9. php: 文件上传

    1.主页: <!DOCTYPE html><html lang="en"><head>    <meta charset="UT ...

  10. greenplum 数组操作

    参考:http://gpdb.docs.pivotal.io/4390/admin_guide/query/topics/functions-operators.html Table 4. Advan ...