[iOS开发]swift闭包中self使用
2020-08-30 本文已影响0人
沈枫_ShenF
Swift 中的引用方式有以下三种:
-
强引用:默认,持有其他对象不放,直到自己的生命周期结束。
-
弱引用(weak):对象在就有值,对象没了就是 nil,所以必须是可选类型。
-
无主引用unowned):强制解包的弱引用,对象在一切安好,对象没了直接崩溃。
在闭包中通常我们会加上这一句:
[weak self] in guard let self = self else { return }
它会先弱引用 self,然后通过guard确认我们能够暂时强引用 self,在闭包运行结束之后就释放对 self 的引用,这样就能解决大部分闭包导致的引用循环了!不过,如果出现多层闭包嵌套,通常我们的做法如下:
这样写还是可能会循环引用, 因为async 的闭包已经把 self 转为了强引用,所以 animate 的闭包用的 self 也是强引用的。那改成如下写法呢:
还是可能会循环引用,因为编译器为了能够让内层anmation的闭包弱引用 self,会在外层dataTask
的闭包默认强引用了 self,也就是说 dataTask 里的 self 是强引用。所以正确的写法是:
或者一直用 weak self :
参考Stack Overflow:
how-to-correctly-handle-weak-self-in-swift-blocks-with-arguments