2014-10-24 17 views

risposta

22

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.

+1

Ma cosa significano questi equivalenti Objective-C? – orome

+11

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

+0

Sì, questo è un buon riassunto. –

11

Ecco una citazione da Apple Developer Forums:

unowned vs unowned(safe) vs unowned(unsafe)

unowned(safe) è un riferimento non proprietario che asserisce in materia di accesso che l'oggetto è ancora vivo. È un po 'come un riferimento facoltativo debole che è implicitamente scartato con x! ogni volta che si accede. __unsafe_unretained in ARC: è un riferimento non proprietario di , ma non esiste il controllo di runtime che l'oggetto sia ancora attivo in accesso, quindi i riferimenti ciondolanti raggiungeranno la memoria obsoleta. unowned è sempre un sinonimo per attualmente, ma l'intento di è che sarà ottimizzato per unowned(unsafe) in -Ofast build quando i controlli di runtime sono disabilitati.

0

Una definizione semplice. che eliminerebbe la confusione.

- attributi non condivisi: se si tenta di accedere a un riferimento non condiviso dopo che l'istanza a cui si riferisce viene deallocata, il programma si bloccherà.

- attributi non protetti (non sicuri): se si tenta di accedere a un riferimento non sicuro non protetto dopo che l'istanza a cui si riferisce viene deallocata, il programma tenterà di accedere alla posizione di memoria in cui si trovava l'istanza, che è un operazione non sicura. (Nessuna garanzia montone castrato questo sarebbe esegue o si blocca)

0

variabile si accede quando è stato dellocated già con l'attributo:

senza proprietario

  • programma sa che non è valido, e va subito crash.
  • Il comportamento è definito.

senza proprietario (non sicuro)

  • programma sa nulla.
  • Potrebbe bloccarsi immediatamente.
  • Può accedere a un indirizzo di memoria sconosciuto e avere uno stato strano fino a quando non muore nella posizione sorpresa.
  • Il comportamento è indefinito. La vita diventa più difficile
Problemi correlati