在swift中使用strongSelf的正确方法是啥?
Posted
技术标签:
【中文标题】在swift中使用strongSelf的正确方法是啥?【英文标题】:What is the correct way of use strongSelf in swift?在swift中使用strongSelf的正确方法是什么? 【发布时间】:2015-07-16 12:41:33 【问题描述】:在 Objective-C 中的重要块中,我注意到使用了 weakSelf/strongSelf。
在 Swift 中使用 strongSelf 的正确方法是什么? 比如:
if let strongSelf = self
strongSelf.doSomething()
所以对于每行包含 self 的闭包我应该添加 strongSelf 检查?
if let strongSelf = self
strongSelf.doSomething1()
if let strongSelf = self
strongSelf.doSomething2()
有什么办法可以让上述更优雅?
【问题讨论】:
strongSelf
没有什么特别之处。这只是一个变量名。也许添加您希望复制的 Objective-C 代码?你在这里所做的和简单的self?.doSomething()
没有什么不同
请检查这个问题有[unowned self]
在swift中:***.com/questions/24320347/…和dhoerl.wordpress.com/2013/04/23/…
【参考方案1】:
使用strongSelf
是一种检查self
不等于nil 的方法。当您有一个可能在将来某个时间点调用的闭包时,传递 self 的 weak
实例非常重要,这样您就不会通过持有对已取消初始化的对象的引用来创建保留循环。
[weak self] () -> void in
if let strongSelf = self
strongSelf.doSomething1()
本质上,您是说如果 self 不再存在,请不要对其进行引用并且不要对其执行操作。
【讨论】:
您也可以在此处将if let
替换为guard let
以避免另一个嵌套(缩进)级别:guard let strongSelf = self else return
【参考方案2】:
斯威夫特 4.2 ?
guard let self = self else return
参考:https://benscheirman.com/2018/09/capturing-self-with-swift-4-2/ 参考2:https://www.raywenderlich.com/5370-grand-central-dispatch-tutorial-for-swift-4-part-1-2
【讨论】:
【参考方案3】:不使用strongSelf
的另一种使用weak self
的方式
[weak self] () -> void in
guard let `self` = self else return
self.doSomething()
【讨论】:
我喜欢这个但要小心。 Chris Lattner 明确表示这是一个编译器错误lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160118/…【参考方案4】:如果self
不为零,您对strongSelf
的使用似乎只针对调用doSomethingN()
方法。相反,使用可选方法调用作为首选方法:
self?.doSomethingN()
【讨论】:
【参考方案5】:如果你在你的闭包中使用self
,它会自动被用作strong。
如果您试图避免保留周期,也可以使用 weak
或 unowned
。它是通过在闭包的参数之前传递 [unowned self] 或 [weak self] 来实现的。
【讨论】:
以上是关于在swift中使用strongSelf的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
关于block中使用weakSelf和strongSelf的问题
在 Swift 中使用 Objective-C 类别的正确方法是啥?
我是不是需要在块内的 strongSelf = weakSelf 分配上检查 nil ?
在 Swift 中结束 CAEmitterLayer 的正确方法是啥?