解析Swift中闭包的循环引用
来源:互联网 发布:护眼有什么软件 编辑:程序博客网 时间:2024/06/07 20:49
解析Swift中闭包的循环引用
1.什么时候会发生循环引用
原理跟OC中的block类似, 当有个属性记录下了函数传递回来的闭包, 产生强引用, 就会发生闭包的循环引用
2.怎么解决循环引用
如何解决闭包的循环引用, 同样有三种方式:
使用weak修饰变量, 打破强引用, 因为使用weak修饰的变量有一次变成nil的机会
使用[weak self] 修饰闭包原理跟__weak类似, 这样在闭包中使用self, 就是弱引用
使用[unowned self ] 修饰闭包, 跟__unsafe_unretained类似, 不安全
3.如何判断是否发生强引用, 闭包中使用析构函数
- 代码:
//swift dealloc//析构函数deinit{print("销毁")}
- storyboard:
4.Swift中的代码
import UIKitclass 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("销毁") }}
0 0
- 解析Swift中闭包的循环引用
- Swift中闭包的循环引用
- swift之block的循环引用
- swift中解决循环引用的方法
- Swift的循环引用以weak
- swift闭包的循环引用
- swift 闭包循环引用的解决办法
- swift 循环强引用
- swift - 循环引用问题
- Swift闭包循环引用
- Swift 解决循环引用问题
- Swift自定义数据模型及闭包的循环引用问题
- 解决swift中闭包中循环引用self 的问题
- OC和Swift中循环引用的问题
- swift-闭包产生的循环引用以及解决办法
- swift中关于代理的循环引用问题
- swift学习--闭包的循环引用解决
- ios-Swift中解除循环引用的三种方式
- Struts2:前后台的数据交互
- Compile gradle project with another project as a dependency
- 关于线性模型你可能还不知道的二三事
- Linux下生成(加载)动态库静态库和加载示例方法
- Uncompressing Linux..... done, booting the kernel.
- 解析Swift中闭包的循环引用
- ios UITableview 刷新某一个cell 或 section
- java使用listIterator逆序arraylist示例分享
- jquery判断小数点两位跟自动删除小数两位后的数字
- zookeeper HA 实现负载均衡
- iOS移动端使用AES加密注意事项
- 修改centos系统时间为重庆时间(当前时间)
- 华为路由器dhcp简单配置实例
- c++中的string常用函数用法总结