6

有什么方法可以检查unowned(safe)Swift 参考中的“可用性”吗?所以,我正在寻找一个假设函数,如isReferenceAccessible本例所示:

func someMethod() {
  someAsyncOperation(parameters) { [unowned(safe) self] in 
    guard isReferenceAccessible(self) else {
      return
    }

    self.someAnotherMethod()
  }
}

免责声明:这个问题与weak参考无关!我知道strong,unownedweakreferences 是如何工作的。而且我不想使用weak引用(因为它可能很慢且可变)。我知道unowned(safe)即使deinited在我们尝试访问它时已经分配了引用。而且我知道编译器可以执行此检查,并且它实际上会在应用程序崩溃之前对其进行检查。

因此,我相信它可以是非常强大且性能良好的技术/范式,可以打破现代 Swift 中的引用循环。

此外,我相信它可能是一个很棒的语言功能!例如,假设我们调用了修饰符shared_ownership,并且它的工作原理与上述行为类似:

method(parameters) { [shared_ownership self] in
  self.someAnotherMethod()
}

...通过这样的实现:

method(parameters) { [unowned(safe) self] in
  guard isReferenceAccessible(self) else {
    return
  }

  self.someAnotherMethod()
}

...具有副作用(没有weak相关的复杂性和性能损失)相当于:

method(parameters) { [weak self] in
  guard let strongSelf = self else {
    return
  }

  strongSelf.someAnotherMethod()
}

哦,那太棒了!

有关、之间差异的weakunowned(safe)unowned(unsafe)更多信息。

更新

我发现了与上面讨论的特性相关的很棒的 Swift 提案:允许使用可选绑定将 self 从弱引用升级到强引用

4

1 回答 1

7

突然间,我发现我最初的基本假设是weakSwift 中的引用可能很慢是错误的。正如我们从资料中看到的,Swift 实际上使用了几乎相同的实现weakunowned引用。所以weak参考几乎和参考一样快unowned

(但 Objective-C 完全不同,它使用 sidetable 跟踪所有指向周引用的指针,并将 deinit、deallocate 和归零作为一个步骤。而且它可能很慢。)

正因为如此,我的问题毫无意义。我必须使用周参考并解开它,因为我在原始问题的最后一段代码中提出了它。

更新:这是令人难以置信的 Mike Ash 撰写的一篇很棒的文章,描述了Swift 引擎盖下的引用weakunowned工作原理。

于 2016-01-18T19:16:37.287 回答