[英]Why specify [unowned self] in blocks where you depend on self being there?
在块执行期间,我希望自己是非零的,我确信它会是非零的。 那么为什么要明确指定[无主自我]?
object.executeBlock {
date = self.lastModified
}
VS
object.executeBlock { [unowned self] in
date = self.lastModified
}
编辑:嗯,我正在投票,所以让我们再试一次。 问:假设我有问题。 那个问题是我想阻止参考周期。 我有两个选择。 我可以使用[无主的自我]或者我可以使用[弱自我]。 因此,我的问题是:从这两个选项中,为什么我会选择[无主自我]? 为什么不每次选择[弱自我]?
“语言指南声称如果封闭物和包含物体相互引用并且将同时被摧毁,你应该使用无主物。可能这是为了避免安全地在一个即将释放的物体中的弱引用“。
http://www.russbishop.net/swift-capture-lists
所以[无主的自我]使自我成为一个隐含的未包装的选项,为了方便自己不打开它,冒着崩溃的风险,当然它实际上是零。
您真正想要使用[unowned self]
或[weak self]
的唯一时间是您创建一个强大的参考周期。 一个强大的参考周期是当存在一个所有权循环,其中对象最终彼此拥有(可能通过第三方),因此它们将永远不会被释放,因为它们都确保彼此坚持。
你有一个强大的参考周期吗?
我在别处回答。 这是克里夫的笔记:
如果封闭使用自我可能是零[弱自我]。
如果自我永远不会在闭包中使用[无主自我]。
如果你在使用[无主自我]时崩溃了,我猜在封闭的某个时刻自我是零,这就是为什么你不得不选择[弱自我]。
我非常喜欢手册中有关使用强,弱和无封闭的手册的整个部分:
为什么[无主自我]? self指向object,object指向executeBlock,executeBlock指向self,创建一个内存循环。
但是当你说[unowned self]时:系统不会将自己保留在内存中以使闭包起作用。 它将假设在执行闭包时self始终存在。 如果不是出于某种原因,将不会有未定义的行为或类似的东西,但您的应用程序将崩溃,因为它是运行时错误。
这就是stanford iOS开发老师Paul Hegarty所解释的。
在闭包中使用self
可以想象为nil
的情况下,你被迫使用weak
语义(或冒着崩溃的风险)。
在你可以推断self
永远不会是nil
,你可以选择指定:“选择”,因为两者都是正确的并且会起作用。 可以说,一个可以被认为比另一个更“正确”,因为两个语义都满足要求,但一个更具体。
您可能希望指定unowned
而不是self
两个原因:
unowned
参考将更方便使用,因为它不需要打开。 它也可能更有效,因为编译器可能不必为安全释放生成尽可能多的清理代码。
在文档方面,你会对你的程序认为是真实的东西做出某种断言。 如果违反了该假设(假设它是有效的),您可能希望以崩溃的形式找到它。
随后,这也可能使变量的使用减少耗尽:你想一想并记录你的理由,它必须始终存在,然后每次你使用它,你不必花费更多的精神能量想知道“什么如果不在这里我该怎么办?“
可以说,使用let
绑定或guard
语句也可以实现后者。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.