Swift 中的闭包循环引用

本文介绍了Swift中闭包的基本概念及其与Objective-C中Block的相似之处,并详细探讨了闭包在实际应用中可能遇到的循环引用问题及解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述
/*
闭包 与 OC 中的 Block 类似,闭包主要用于异步操作执行完成后的代码回调,网络访问结果以参数的形式传递给调用方
闭包类似于 OC 中的 Block
* 预先定义好的代码
* 在需要时执行
* 可以当作参数传递
* 可以有返回值
* 包含 self 时需要注意循环引用

1.提前准备好的一段可以执行的代码

2.可以当做参数传递
3.在需要的时候 执行闭包
4.在闭包中 访问 self 可能会出现循环引用
*/

import UIKit

class ViewController: UIViewController {

    //记录闭包内容,将闭包作为了属性,而属性默认就是强引用
    var finish : ((dataStr : String)->())?

    override func viewDidLoad() {
        super.viewDidLoad()
        //swift 中的循环引用
        //闭包就是OC中的block

        test2()
    }

    func test3() {
        //闭包循环引用的解决方法
        //2.swift 的方法二.
        //unowned 相当于 OC 中的 assign
        //[unowned self]  `self`不是可选项 表示在闭包中的self对象被回收时,其指针并不会指向nil. 会有风险,造成坏地址访问,也就是野指针错误
        loadData { [unowned self] (dataStr) -> () in
            ////最好将!换成?,这样的话如果为 nil 就不会执行任何操作
            print("\(dataStr)----\(self.view)")
        }
    }

    func test2() {

        //闭包循环引用的解决方法
        //2.swift 的方法一.
        //weak 有机会会指向 nil
        //[weak self]  `self`是可选项  表示在闭包中 self 都是弱引用的
        //与 OC 中的 weak 作用一样 --> __weak
        loadData { [weak self] (dataStr) -> () in
            ////最好将!换成?,这样的话如果为 nil 就不会执行任何操作
            print("\(dataStr)----\(self?.view)")
        }

    }

    func test1() {

        //闭包循环引用的解决方法
        //1.OC 的方法
        weak var weakSelf = self
        loadData { (dataStr) -> () in
//            print("\(dataStr)----\(weakSelf!.view)")
            //最好将!换成?,这样的话如果为 nil 就不会执行任何操作
            print("\(dataStr)----\(weakSelf?.view)")
        }

    }


    func loadData(finish:(dataStr : String)->()) {
        self.finish = finish
        //闭包就是OC中的block
        dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
            //
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                //主线程操作

                self.working()

            })
        }
    }


    func working(){

       self.finish!(dataStr: "swift中的闭包就是 block")
    }

    //析构函数,相当于 delloc
    deinit {
        print("viewController Die")
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值