繁体   English   中英

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

[英]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]的唯一时间是您创建一个强大的参考周期。 一个强大的参考周期是当存在一个所有权循环,其中对象最终彼此拥有(可能通过第三方),因此它们将永远不会被释放,因为它们都确保彼此坚持。

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

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

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

如果自我永远不会在闭包中使用[无主自我]。

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

我非常喜欢手册中有关使用强,弱和无封闭的手册的整个部分:

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

为什么[无主自我]? 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM