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

时间:2016-01-17 20:12:48

标签: swift memory-management weak-references unsafe-unretained

有没有办法检查unowned(safe) Swift参考的“可用性”?所以,我在这个例子中寻找像isReferenceAccessible这样的假设函数:

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

    self.someAnotherMethod()
  }
}

免责声明:此问题与weak引用无关!我知道strongunownedweak引用的工作原理。而且我不想使用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()
}

哦,太棒了!

有关the differences between weak, unowned(safe), and unowned(unsafe)的更多信息。

更新

我找到了与上面讨论的功能相关的令人敬畏的Swift提案:Allow using optional binding to upgrade self from a weak to strong reference

1 个答案:

答案 0 :(得分:6)

突然间,我发现我在Swift中weak引用的原始基础假设可能很慢。正如我们在sources中看到的那样,Swift实际上对weakunowned引用使用了几乎相同的实现。因此,weak引用几乎与unowned引用一样快。

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

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

更新:此处为an awesome article by incredible Mike Ash that describes how weak and unowned references work under the hood in Swift