点击下方大众号卡片,关注我,每天共享一个关于 iOS 的新知识

前语

在 OC 年代我们经常用到 weak self,主要为了解决循环引证,但在 swift 中,还有别的一个相似功用的关键字 unowned self

weak self 我们现已用得很熟练了,但是 unowned self 肯定还有人没用过,今天就来讲讲这个两个的区别。

weak self

weak self 表明对 self 的弱引证,即不保持对 self 的强引证。在闭包中拜访 self 是一个可选类型,你需要在使用它时进行解包,假如在闭包调用之前被开释了,那么弱引证就会自动变为 nil

举个比方:

classMyClass{
varclosure:(()->Void)?

funcsetupClosure(){
closure={[weakself]in
guardletstrongSelf=selfelse{return}
print(strongSelf)
}
}
}

MyClass 强引证 closureclosure 中又强引证 self,因而,假如在 closure 的闭包中不使用 weak self,将发生循环引证,导致 MyClass 无法开释。

unowned self

unowned self 表明对 self 的无主引证,和 weak self 一样,也会对 self 进行弱引证,但它是一个不安全的弱引证,也就是说,闭包调用的时分假如 self 现已开释了,程序将会崩溃。和 weak self 还有一点不同的是,闭包中的 self 并不是可选类型,因而在使用时不需要解包。

仍是上边的比方,假如用 unowned self 实现:

classMyClass{
varclosure:(()->Void)?

funcsetupClosure(){
closure={[unownedself]in
print(self)
}
}
}

总结一下

  1. weak selfunowned self 都能对 self 进行弱引证,都能解决循环引证的问题。

  2. weak self 的效果下,即便 self 现已开释了,在闭包中拜访也是安全的 (只要不强制解包 self)。

  3. unowned self的效果下,假如 self 现已开释了,在闭包中拜访 self 会导致 crash,因而当你清晰知道闭包中的 self 在闭包生命周期内一直存在时,才能够使用 unowned self,比方两个实例之间的联系是父子联系,而且子实例的生命周期不会超越父实例的情况下。

  4. 使用 unowned self 的优点是不需要在闭包中对 self 进行解包操作。

这儿每天共享一个 iOS 的新知识,快来关注我吧

本文同步自微信大众号 “iOS新知”,每天按时共享一个新知识,这儿只是同步,想要及时学到就来关注我吧!