swift之闭包循环引用问题及解决方式
来源:互联网 发布:gm预测软件2007 编辑:程序博客网 时间:2024/04/28 01:23
闭包循环引用问题:
1.问题代码
代码1:viewcontroll
class ViewController: UIViewController { var client: HTTPClient? override func viewDidLoad() { super.viewDidLoad() //weak var weakSelf = self let closure = { (info info: String) -> () in print(info) print(self.view) } client = HTTPClient() client?.loadBigData(closure) } deinit{ print("控制器 销毁") } }
代码2: 网络工具类httpclient
class HTTPClient: NSObject { var callBack: ((info: String)->())? func loadBigData(finish: (info:String) -> ()){ //获取闭包 callBack = finish dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in NSThread.sleepForTimeInterval(2) dispatch_async(dispatch_get_main_queue(), { () -> Void in self.dealData() }) } } //数据处理方法 func dealData(){ let str = "我是阳光的奇葩之都" callBack?(info: str) } deinit{ print("网络请求类 销毁") }}
细致观察:里面隐藏着一个循环引用链,导致controller 不能释放
关系是这样的 controller(强引用)->httpclient(强引用)->callback闭包(强引用)->self.view(即viewcontroller) 这样导致控制器不能释放
解决思路:将闭包callback对viewcontroller的强引用变成弱引用
修改后的代码
weak var weakSelf = self let closure = { (info info: String) -> () in print(info) print(weakSelf?.view) }
1 0
- swift之闭包循环引用问题及解决方式
- Swift自定义数据模型及闭包的循环引用问题
- swift闭包循环引用问题
- swift中解决闭包循环引用的几种方式
- Swift中解决闭包循环引用的几种方式
- Swift 解决循环引用问题
- 15.9 Swift解决闭包引起的循环强引用问题
- swift学习--闭包的循环引用解决
- Swift闭包循环引用
- Swift 闭包中循环引用解决方式
- IOS闭包循环引用(Swift)
- Swift 闭包循环引用安全
- swift中防止闭包循环引用
- Swift 中的闭包循环引用
- swift 闭包引用循环中的迷魂阵
- swift闭包的循环引用
- swift 闭包循环引用的解决办法
- swift基本语法(总结提炼版)之014 swift 之闭包循环引用
- unbantu15.10安装android studio 2.0 beta5
- Runtime.addShutdownHook的用法
- phpmailer 中文使用说明(简易版)
- springmvc集成Quartz
- The Swift Programming Language学习笔记(十七)——自动引用计数
- swift之闭包循环引用问题及解决方式
- 嵌入式学习为什么要选择4412开发板
- Linux 有问必答:如何知道进程运行在哪个 CPU 内核上?
- 打印php信息的方法
- android开发环境搭建(Eclipse版)
- 根据中序遍历和后序遍历求二叉树的先序遍历
- Navicat For Mysql快捷键
- PHP 魔术方法__set() __get() 方法
- STM32 Keil仿真进不了Main()函数