在使用block过程中经常会遇到使用[weak self] 或者 [unowned self]来防止block的循环引用,通常情况下我们会使用以下语法来解决,在闭包的最开始加上这行全是关键字的代码:
[weak self] in guard let self = self else { return }
它会先弱引用 self,然后确认我们能够暂时强引用 self,在闭包运行结束之后就释放对 self 的引用,这样就能解决大部分闭包导致的引用循环了!
也可以在代码块中直接使用self?或者self!解包
Swift 4.2之前,self 是全局保留关键字,所以如果在逃逸闭包中如果在闭包中把 self 标记为 weak 后,如果要使用需要使用 `` 包起来使用:
xx.xxBlock = {[weak self] in
guard let `self` = self else { return }
///code....
}
Swift之父坦白,这是个bug 不过开发者似乎很喜欢这个bug。
虽然这样解决了变量名的问题,但是也带来另外一个困扰,控制台里不会显示一个名为 self 的变量。所以也有一种普遍的做法是取个别名,比如 strongSelf
xx.xxBlock = {[weak self] in
guard let strongSelf = self { else return }
///code....
}
Swift4.2之后,苹果终于响应了这个请求,现在 otional binding 中 self 不再作为保留关键字。因此我们可以光明正大的这么写了
xx.xxBlock = {[weak self] in
guard let self = self else { return }
///code....
}
网友评论