有没有办法检查"无主"(实际上是"无主(安全)")参考已被删除?

Val*_*gin 6 memory-management weak-references unsafe-unretained swift

有没有办法检查unowned(safe)Swift引用的"可用性"?所以,我正在寻找一个假设的函数isReferenceAccessible,如下例所示:

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

    self.someAnotherMethod()
  }
}
Run Code Online (Sandbox Code Playgroud)

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

因此,我相信它可以是非常强大且执行良好的技术/范例,可以打破现代Swift中的参考周期.

而且,我相信它可以是一个很棒的语言功能!例如,让我们假设我们已经调用了修饰符shared_ownership,它的工作思路如上所述:

method(parameters) { [shared_ownership self] in
  self.someAnotherMethod()
}
Run Code Online (Sandbox Code Playgroud)

......实现如下:

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

  self.someAnotherMethod()
}
Run Code Online (Sandbox Code Playgroud)

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

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

  strongSelf.someAnotherMethod()
}
Run Code Online (Sandbox Code Playgroud)

哦,太棒了!

有关更多信息之间的差异weak,unowned(safe)以及unowned(unsafe).

更新

我找到了与上面讨论的功能相关的令人敬畏的Swift提议:允许使用可选绑定将self从弱引用升级到强引用.

Val*_*gin 6

突然间我发现我weak在Swift 中引用的原始基础假设可能很慢是错误的.正如我们从源代码中看到的,Swift实际上使用了几乎相同的实现weakunowned引用.所以weak参考几乎和unowned参考一样快.

(但是Objective-C是完全不同的故事,它使用sidetable跟踪所有指向周参考的指针,并将deinit,deallocate和zeroing作为一步.它可能很慢.)

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

更新:这是一篇由令人难以置信的Mike Ash撰写的精彩文章,描述了Swift中引擎的工作方式weakunowned参考.