您的位置:首页 > 移动开发 > Swift

swift学习--闭包的循环引用解决

2017-07-06 10:50 489 查看
一、什么是循环引用、怎么发生的

     循环引用就是当self 拥有一个block的时候,在block 又调用self的方法。形成你中有我,我中有你,谁都无法将谁释放的困局。

    在oc中,通常解决block循环引用的办法就是weak来修饰self!

    __weak typeof self (weakself) = self

    swift中的闭包等于OC中的block,因此在使用闭包的时候也需要注意循环引用的问题

二、解决swift中闭包循环引用问题

  1.类似block解决办法

weak var weakSelf = self
//解决循环引用 ,这里用var 而不用let
//因为weak可能在运行时被修改 ——》指向的对象一旦被释放,会被设为nil
GCDText { (data) in

//? 可选解包 , 对象为nil,不会向对象发送getter消息,更安全
//! 强行解包 ,如果对象为nil 会发生崩溃,一般用于对象接下来要进行计算
print(weakSelf?.view ?? UIView())

}
2.swift解决方法,推荐使用

GCDText {[weak self] (data) in

print(self?.view ?? UIView())
}

3.unowned;

GCDText { [unowned self](data) in

}
unowned

   

    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  swift