Есть ли способ проверить, что ссылка "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.