为什么要在依赖自己的地方指定[无主自我]?

时间:2015-10-04 17:28:35

标签: swift block retain-cycle

我希望自己是非零的,我确信它会在块执行期间出现。那么为什么要明确指定[无主自我]?

object.executeBlock {
    date = self.lastModified
}

VS

object.executeBlock { [unowned self] in
    date = self.lastModified
}

编辑: 好吧,我正在投票,所以让我们再试一次。问:假设我有问题。那个问题是我想阻止参考周期。我有两个选择。我可以使用[无主的自我]或者我可以使用[弱自我]。因此,我的问题是:从这两个选项中,为什么我会选择[无主自我]?为什么不每次选择[弱自我]?

5 个答案:

答案 0 :(得分:5)

“语言指南声称,如果封闭物和包含物体相互引用并且将同时被销毁,则应该使用无主物。假设这是为了避免安全地将物体中的弱参考物安全地丢弃的成本。反正dealloc。“

http://www.russbishop.net/swift-capture-lists

所以[无主的自我]使自我成为一个隐含的未包装的选项,为了方便自己不打开它,冒着崩溃的风险,当然它实际上是零。

答案 1 :(得分:3)

您真正想要使用[unowned self][weak self]的唯一时间是创建强大的参考周期。一个强大的参考周期是当存在一个所有权循环,其中对象最终彼此拥有(可能通过第三方),因此它们永远不会被释放,因为它们都确保彼此坚持。

那里有一个强大的参考周期吗?

答案 2 :(得分:2)

我在别处回答了这个问题。这是克里夫的笔记:

如果封闭使用自我可能是零[弱自我]。

如果封闭使用[无主自我],那么自我永远不会是零。

如果你在使用[无主自我]时崩溃了,我猜在封闭的某个时刻自我是零,这就是为什么你不得不选择[弱自我]。

我真的很喜欢手册中关于在闭包中使用强,弱和无主的整个部分:

https://developer.apple.com/library/ios/documentation/swift/conceptual/swift_programming_language/AutomaticReferenceCounting.html

答案 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}}语句也可以实现后者。