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 ...
随机推荐
- js读取本地json/txt/xml存在跨越问题,可以用jsonp 读取本地json文件
想自己用 js写一个原生的ajax请求,访问本地文件,json/txt.但是demo,写了一个后,发现 原来是跨域了. js 写的原生ajax 请求代码如下 html代码 <div id=&qu ...
- list.OfType()
将两个类型不同是实体存入到一个object可以通过OfType方法分别取出来 //将两个类型不同是实体存入到一个object可以通过OfType方法分别取出来 List<Phone> Ph ...
- cmd进入任何一个文件夹的步骤?
cmd进入任何一个文件夹的步骤具体如下: 步骤如下: 1.点击左下角[开始],在搜索程序和文件中输入:cmd,进入cmd命令窗口: 2.进入到D盘,在cmd命令窗口输入:D: 3.进入D盘后,输入:c ...
- vue dialog每次打开会展示上一次数据(转载)
原文地址: (https://www.jianshu.com/p/82b6681d0768) 在dialog外套一层div,div中以v-if来控制组件el-dialog的出现与否,每次弹出el-di ...
- 解决vue更新默认值时出现的闪屏问题
在Vue项目中,对于一个展示用户个人信息的页面.有以下需求,需要判断用户个人信息是否填充过,如果填充过,需要在页面中展示已填充项(未填充项不展示):如果未填充过,需要在页面中显示另外一种元素(提示用“ ...
- D. Cow and Snacks 并查集
D. Cow and Snacks 题意:有n种小吃,m个人,每个人有两种喜欢的小吃,当一个人遇到两种自己都喜欢的小吃,可以都吃掉,问在最优的吃小吃顺序下,不能吃到自己喜欢的小吃的人数最少是多少? 题 ...
- [网络必学]TCP/IP四层模型讲解【笔记整理通俗易懂版】
OSI七层模型 表示层:用来解码不同的格式为机器语言,以及其他功能. 会话层:判断是否需要网络传输. 传输层:识别端口来指定服务器,如指定80端口的www服务. 网络层:提供逻辑地址选路,即发 ...
- Cookie跨域setDomain和setPath
CSDN日报20170226--<你离心想事成只差一个计划> 程序员2月书讯 [招募]Python学习班招生啦 Cookie跨域setDomain和setPath 标签: cookiesp ...
- Postgresql数据库数据简单的导入导出
Postgresql数据库数据简单的导入导出 博客分类: DataBase postgres 命令操作: 数据的导出:pg_dump -U postgres(用户名) (-t 表名) 数据库名( ...
- (十)微信小程序---上传图片chooseImage
官方文档 示例一 wxml <view bindtap="uploadImage">请上传图片</view> <image wx:for=" ...