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