有没有办法检查“无主”(实际上是“无主(安全)”)引用是否已启动



有没有办法检查unowned(safe) Swift 引用的"可用性"?因此,我正在寻找一个假设的函数,如本例中的isReferenceAccessible

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

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

因此,我相信它可以是非常强大且性能良好的技术/范式,用于打破现代 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 建议:允许使用可选绑定将自身从弱引用升级到强引用。

突然间

,我发现我最初的基本假设是 Swift 中的weak引用可能很慢是错误的。正如我们从源代码中看到的,Swift 实际上对weakunowned引用使用了几乎相同的实现。因此weak参考几乎与unowned参考一样快。

(但是Objective-C是完全不同的故事,它使用侧表来跟踪所有指向周引用的指针,并一步进行deinit,deplaceate和归零。而且可能会很慢。

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

更新:这是一篇由令人难以置信的 Mike Ash 撰写的精彩文章,描述了 Swift 中weakunowned引用是如何工作的。

相关内容

  • 没有找到相关文章

最新更新