Есть ли способ проверить, что ссылка "unowned" (на самом деле "unowned(safe)`) "была деиницирована?

Есть ли способ проверить unowned(safe) Быстрая ссылка на "доступность"? Итак, я ищу гипотетическую функцию, такую ​​как isReferenceAccessible в этом примере:

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

    self.someAnotherMethod()
  }
}

Отказ от ответственности: этот вопрос не о weak Рекомендации! Я в курсе как strong, unowned а также weak ссылки работают. И я не хочу использовать 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()
}

О, это было бы здорово!

Больше информации о различиях между weak , unowned(safe) , а также unowned(unsafe),

Обновить

Я нашел отличное предложение Swift, связанное с обсуждаемой выше функцией: Разрешить использование необязательного связывания для перехода от слабой к сильной ссылке.

1 ответ

Решение

Внезапно я обнаружил, что мое исходное предположение о том, что weak Ссылка в Swift может быть медленной, это неправильно. Как мы видим из источников, Swift фактически использует почти такую ​​же реализацию для weak а также unowned Рекомендации. Так weak ссылка почти так же быстро, как unowned ссылка.

(Но Objective-C - это совсем другая история, он использует sidetable с отслеживанием всех указателей на недельные ссылки и деинитирование, освобождение и обнуление как один шаг. И это может быть медленным.)

И из-за этого мои вопросы не имеют смысла. Я должен использовать недельный справочник и развернуть его, как я предложил в последнем фрагменте кода в моем исходном вопросе.

Обновление: вот потрясающая статья невероятного Майка Эша, которая описывает, как weak а также unowned Ссылки работают под капотом в Swift.

Другие вопросы по тегам