Da quello che ho capito, anche se non riesco a trovare una fonte definitiva da Apple, unowned
può essere suddiviso in due versioni, safe
e unsafe
.
Un valore di unowned
è : è un riferimento appositamente spostato che genera un'eccezione quando si fa riferimento a un'istanza dealloced.
Il caso speciale è unowned(unsafe)
: è l'equivalente Swift di Objective C @property (assign)
o __unsafe_unretained
. Non dovrebbe essere usato in un programma Swift, perché il suo scopo è quello di collegare al codice scritto nell'obiettivo C.
Quindi, vedrai unowned(unsafe)
quando guardi il wrapper di importazione per le classi Cocoa, ma non usarlo a meno devi e saprai quando devi.
Aggiornamento
__unsafe_unretained
è un puntatore semplice. Non saprà quando l'istanza puntata è stata deallocata, quindi quando è dereferenziata, la memoria sottostante potrebbe essere spazzatura.
Se si dispone di un difetto in cui viene utilizzata una variabile dealgated __unsafe_unretained
, verrà visualizzato un comportamento irregolare. A volte una quantità sufficiente di tale posizione di memoria è sufficiente per far funzionare il codice, a volte sarà stato parzialmente sovrascritto in modo da ottenere arresti anomali e talvolta la posizione di memoria conterrà un nuovo oggetto in modo da ottenere eccezioni selettrici non riconosciute.
Transitioning to ARC Release Notes
__unsafe_unretained
specifica un riferimento che non mantiene l'oggetto di riferimento vivo e non è impostato a zero quando non ci sono forti riferimenti all'oggetto. Se l'oggetto a cui fa riferimento viene deallocato, il puntatore viene lasciato penzolare.
fonte
2014-10-24 22:09:32
Ma cosa significano questi equivalenti Objective-C? – orome
Quindi, per riassumere, a differenza dei riferimenti 'strong',' weak' e tutti gli 'unowned's non contribuiscono al conteggio dei riferimenti. Quindi, una volta eliminati tutti i riferimenti 'strong', l'istanza referenziata verrà deallocata (quando rimarranno solo i riferimenti' weak' e 'unowned'); I riferimenti 'weak' saranno impostati su' nil' (hanno quindi un tipo opzionale), mentre 'unowned' non lo sarà. Tuttavia i riferimenti "unowned (safe)" alle istanze deallocated generano un'eccezione prevedibile quando vi si accede, mentre i riferimenti "unowned (non sicuri)" agiranno come un semplice puntatore vecchio e si comportano in modo imprevedibile. Destra? – orome
Sì, questo è un buon riassunto. –