Existe maneira de verificar se uma referência `sem dono '(na verdade` sem dono (seguro) `) foi desinitada?
Existe alguma maneira de verificar umaunowned(safe)
Referência rápida para "disponibilidade"? Então, estou procurando uma função hipotética comoisReferenceAccessible
neste exemplo:
func someMethod() {
someAsyncOperation(parameters) { [unowned(safe) self] in
guard isReferenceAccessible(self) else {
return
}
self.someAnotherMethod()
}
}
Aviso Legal:Esta questão não é sobreweak
referências! Estou ciente de comostrong
, unowned
eweak
trabalho de referências. E eu não quero usarweak
referências (porque pode ser lento e mutável). Eu sei dissounowned(safe)
referências ainda serão alocadas, mesmo que já estejamdeinited
quando estamos tentando acessá-lo. E eu sei que um compilador pode fazer essa verificação e, na verdade, antes de um aplicativo falhar.
Portanto, acredito que possa ser uma técnica / paradigma muito poderosa e bem executada para quebrar os ciclos de referência no Swift moderno.
Além disso, acredito que pode ser um recurso incrível de linguagem! Por exemplo, vamos assumir que temos o modificador chamadoshared_ownership
e funciona o pensamento acima descrito comportamento como este:
method(parameters) { [shared_ownership self] in
self.someAnotherMethod()
}
... com uma implementação como esta:
method(parameters) { [unowned(safe) self] in
guard isReferenceAccessible(self) else {
return
}
self.someAnotherMethod()
}
... com efeitos colaterais (semweak
complexidade relacionada e penalidade de desempenho) equivalente a:
method(parameters) { [weak self] in
guard let strongSelf = self else {
return
}
strongSelf.someAnotherMethod()
}
Oh, seria fantástico!
Mais informações sobreas diferenças entreweak
, unowned(safe)
eunowned(unsafe)
.
Encontrei uma proposta impressionante do Swift que relacionava o recurso discutido acima:Permitir o uso de ligação opcional para atualizar a si próprio de uma referência fraca para forte.