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 ...
随机推荐
- Eclipse中创建新的SpringBoot项目(打包并且部署到tomcat)
Spring-boot因为其对jar包的高度集成以及简化服务配置,快速部署等的优点,逐渐成为Java开发人员的热衷的框架.下面演示一下怎么在Eclipse中新建Spring-boot项目以及打包部署. ...
- 数据库事务ACID特效
一.数据库事务正确执行的4个基础要素: 1.原子性 整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节.事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状 ...
- 远程服务器使用tensorboard
1 .由于服务器上tensorboard使用的端口是6006,因此,连接ssh时,将服务器的6006端口重定向到自己机器上的16006端口: ssh -L 16006:127.0.0.1:6006 u ...
- java核心-多线程(6)-线程池-ThreadPoolExecutor
1.java多线程编程少不了使用线程池,线程池相关的工具类所在jdk包,java.util.concurrent 2.使用示例 demo1 public class ThreadPoolDemo { ...
- k-近邻算法的优缺点及拓展思考
//2019.08.03晚#k-近邻算法的拓展思考与总结1.k-近邻算法是一种非常典型的分类监督学习算法,它可以解决多分类的问题:另外,它的整体思想简单,效果强大.它也可以用来解决回归问题,使用的库函 ...
- vSphere 高级特性FT配置与管理
内容预览: 1. Fault Tolerance 的工作方式 2. 5.X版本FT使用的vLockstep技术 3. 6.X版本FT使用的Fast Checkpointing技术 4. FT不支持的v ...
- numpy.linspace使用详解
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) 在指定的间隔内返回均匀间隔的数字. 返回nu ...
- python手动实现深拷贝
深拷贝是将对象全拷贝,包括嵌套对象 def deepcopy(cls): if isinstance(cls, dict): dct = {} for k, v in cls.items(): dct ...
- Educational Codeforces Round 64 选做
感觉这场比赛题目质量挺高(A 全场最佳),难度也不小.虽然 unr 后就懒得打了. A. Inscribed Figures 题意 给你若干个图形,每个图形为三角形.圆形或正方形,第 \(i\) 个图 ...
- 自己写个tween
public Vector3 begin,end;//起始终止坐标 public float BtoE_time;//用时 float timer,lerp;//计时器和进度值 void Update ...