解析Swift中闭包的循环引用
2016-07-18 11:09
435 查看
解析Swift中闭包的循环引用
1.什么时候会发生循环引用
原理跟OC中的block类似, 当有个属性记录下了函数传递回来的闭包, 产生强引用, 就会发生闭包的循环引用
2.怎么解决循环引用
如何解决闭包的循环引用, 同样有三种方式:使用weak修饰变量, 打破强引用, 因为使用weak修饰的变量有一次变成nil的机会使用[weak self] 修饰闭包原理跟__weak类似, 这样在闭包中使用self, 就是弱引用使用[unowned self ] 修饰闭包, 跟__unsafe_unretained类似, 不安全
3.如何判断是否发生强引用, 闭包中使用析构函数
代码://swift dealloc //析构函数 deinit{ print("销毁") }storyboard:748058-d28cabf10ff73b50.png
4.Swift中的代码
import UIKit class ViewController: UIViewController { var finishedCallBack: ( (dataString: String) -> () )? override func viewDidLoad() { super.viewDidLoad() //解决方式三: [unowned self] 跟 _unsafe_unretained 类似 不推荐使用 loadData { [unowned self] (dataString) -> () in print("\(dataString) \(self.view)") } } func method2() { //解决方式二: 在swift中 有特殊的写法 ,跟OC __weak 相似 [weak self] loadData { [weak self] (dataString) -> () in //以后在闭包中中 使用self 都是若引用的 print("\(dataString) \(self?.view)") } } func method1() { // 解决方式一: weak weak var weakSelf = self loadData { (dataString) -> () in print("\(dataString) \(weakSelf?.view)") } } func loadData(finished: (dataString: String) -> ()) { // 记录闭包 self.finishedCallBack = finished //加载数据 dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in print("执行耗时操作") dispatch_async(dispatch_get_main_queue(), { () -> Void in //执行回调 self.working() }) } } func working() { self.finishedCallBack?(dataString: "<html>") } //swift dealloc //析构函数 deinit { print("销毁") } }
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 深入理解PHP之匿名函数
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- Apple Swift学习教程
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- 最后一次说说闭包
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 介绍 Fedora 上的 Swift
- Ruby中使用Block、Proc、lambda实现闭包
- LUA中的闭包(closure)浅析
- Lua中的闭包学习笔记
- C#中函数的创建和闭包的理解
- 深入理解javascript作用域和闭包
- javascript作用域和闭包使用详解
- 谈谈JavaScript中的函数与闭包
- 细品javascript 寻址,闭包,对象模型和相关问题