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 ...
随机推荐
- Memcached 最新版本发布,不再仅仅是个内存缓存了
导读 Memcached 1.5.18和之后版本可以在服务重启时恢复内存缓存.新版本还通过DAX文件系统挂载来实现缓存持久性功能. 可以通过在启动选项使用该功能: -e /tmpfs_mount/me ...
- storm正常任务数据量过大时造成定时任务不执行的问题
在执行storm的定时任务时,发现storm普通任务数据量过大时造成定时任务不执行, 同时设置了storm的普通任务和定时任务,定时任务设置5秒执行1次. 普通任务的数据时从spout中不停发射字符串 ...
- P1091合唱队形(LIS问题)
题目描述(题目链接:https://www.luogu.org/problem/P1091) NN位同学站成一排,音乐老师要请其中的(N-KN−K)位同学出列,使得剩下的KK位同学排成合唱队形. 合唱 ...
- php 实现店铺装修7
type_id=0的情况 type_id=1的情况 type_id=2的情况 /** * @title 店铺装修--商品分类 * @param type ...
- 十一 Socket编程
一. 计算机网络: 将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来在网络操作系统.网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统 二. ...
- Django 利用第三方平台实现用户注册
前言: 登陆和注册功能是一个功能比较完善的网站必备的功能,其中涉及的业务逻辑实用性较强,所以我将Django的注册功能进行了总结,希望可以帮助大家.我们这次使用的第三方短息平台是云通信,当然你可以用其 ...
- STM32学习笔记:为什么使用外部中断要打开syscfg时钟?
AFIO时钟只是在STM32F1系列里被提及. 对于32F1系列,涉及到管脚的EXTI. REMAP.事件输出时就需要开启AFIO时钟. 比方上面提到的管脚REMAP,必须先开AFIO时钟.配置EXT ...
- msf生成软件
生成软件后门程序的命令 win7获取 生成内网软件 启动kali上的http服务 systemctl start apache2 开始msf控制台 msfconsole 使用监听模块 并查看配置 s ...
- vs2010编译C++ 栈的使用
// CTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include &l ...
- 【Winform】ProgressBar
var progressBar1 = new System.Windows.Forms.ProgressBar(); ; progressBar1.Maximum = ; progressBar1.V ...