swiftios常用功能

[iOS开发]swift闭包中self使用

2020-08-30  本文已影响0人  沈枫_ShenF

Swift 中的引用方式有以下三种:

在闭包中通常我们会加上这一句:

[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

为什么在闭包中又将self转回strong类型

上一篇下一篇

猜你喜欢

热点阅读