闭包的循环引用

class ViewController: UIViewController {

    // Swift中定义属性, 必须在构造方法中初始化, 否则就必须加上?,?表示可选类型,可以有值,也可以没有值
    // 注意: 以下写法代表闭包的返回值可以为nil
    // var finished: ()->()?//这是一个错误的写法,表示闭包的返回值是可选类型
    var finished: (()->())?
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // OC中 __weak typeof(self) weakSelf = self
        weak var weakSelf = self
        loadData { () -> () in
            
            print("更新UI")
            // 闭包和block很像, 都是提前准备好代码, 在需要时执行
            // block会对外部变量进行copy, 保证执行代码时变量还在
            // block中用到self一定要非常小心
            // 闭包也一样, 为了能够准确定位到view, 所以需要写self
            // 提示: Swift开发中能不写self就不写self, 一看到self就想到闭包
//            self.view.backgroundColor = UIColor.redColor()//这行代码会造成内存泄漏
            weakSelf!.view.backgroundColor = UIColor.redColor()//weakSelf 应该为可选类型,因为它依赖self,如果self释放掉了,它就没有值了
//在闭包中必须要写self,因为闭包执行的时间不一定,如果有self就意味着引用  
 }
    }
    func loadData(finished: ()->()){
        print("耗时操作")
        // 保存闭包
        self.finished = finished
        finished()
    }
    
    // 类似于dealloc方法
    deinit
    {
        print("我滚了")
    }

}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值