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. Memcached 最新版本发布,不再仅仅是个内存缓存了

    导读 Memcached 1.5.18和之后版本可以在服务重启时恢复内存缓存.新版本还通过DAX文件系统挂载来实现缓存持久性功能. 可以通过在启动选项使用该功能: -e /tmpfs_mount/me ...

  2. storm正常任务数据量过大时造成定时任务不执行的问题

    在执行storm的定时任务时,发现storm普通任务数据量过大时造成定时任务不执行, 同时设置了storm的普通任务和定时任务,定时任务设置5秒执行1次. 普通任务的数据时从spout中不停发射字符串 ...

  3. P1091合唱队形(LIS问题)

    题目描述(题目链接:https://www.luogu.org/problem/P1091) NN位同学站成一排,音乐老师要请其中的(N-KN−K)位同学出列,使得剩下的KK位同学排成合唱队形. 合唱 ...

  4. php 实现店铺装修7

    type_id=0的情况 type_id=1的情况                         type_id=2的情况 /** * @title 店铺装修--商品分类 * @param type ...

  5. 十一 Socket编程

    一.  计算机网络: 将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来在网络操作系统.网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统 二.   ...

  6. Django 利用第三方平台实现用户注册

    前言: 登陆和注册功能是一个功能比较完善的网站必备的功能,其中涉及的业务逻辑实用性较强,所以我将Django的注册功能进行了总结,希望可以帮助大家.我们这次使用的第三方短息平台是云通信,当然你可以用其 ...

  7. STM32学习笔记:为什么使用外部中断要打开syscfg时钟?

    AFIO时钟只是在STM32F1系列里被提及. 对于32F1系列,涉及到管脚的EXTI. REMAP.事件输出时就需要开启AFIO时钟. 比方上面提到的管脚REMAP,必须先开AFIO时钟.配置EXT ...

  8. msf生成软件

    生成软件后门程序的命令 win7获取 生成内网软件 启动kali上的http服务 systemctl start apache2 开始msf控制台 msfconsole 使用监听模块 并查看配置  s ...

  9. vs2010编译C++ 栈的使用

    // CTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include &l ...

  10. 【Winform】ProgressBar

    var progressBar1 = new System.Windows.Forms.ProgressBar(); ; progressBar1.Maximum = ; progressBar1.V ...