[ios] Objective-C ARC: strong vs retain e weak vs assign


Answers

Dopo aver letto tanti articoli Stackoverflow e applicazioni demo per controllare gli attributi delle proprietà variabili, ho deciso di mettere insieme tutte le informazioni sugli attributi:

  1. atomico // predefinito
  2. nonatomic
  3. strong = retain // default
  4. debole
  5. conservare
  6. assegna // default
  7. unsafe_unretained
  8. copia
  9. sola lettura
  10. readwrite // default

Di seguito è riportato il link dell'articolo dettagliato in cui è possibile trovare tutti gli attributi sopra indicati, che sicuramente ti aiuteranno. Mille grazie a tutte le persone che danno le migliori risposte qui !!

Attributi di proprietà variabili o modificatori in iOS

1. forte (iOS4 = conservare)

  • dice "mantieni questo nel mucchio finché non lo indico più"
  • in altre parole "Io sono il proprietario, non puoi deallocare questo prima di mirare bene con quello stesso di conservare"
  • Si utilizza forte solo se è necessario conservare l'oggetto.
  • Di default tutte le variabili di istanza e le variabili locali sono potenti puntatori.
  • Generalmente usiamo forti per UIViewControllers (i genitori degli elementi dell'interfaccia utente)
  • strong è usato con ARC e fondamentalmente ti aiuta, non dovendo preoccuparti del numero di ritenzione di un oggetto. ARC lo rilascia automaticamente quando hai finito. Utilizzare la parola chiave strong significa che possiedi l'oggetto.

Esempio:

@property (strong, nonatomic) ViewController *viewController;

@synthesize viewController;

2. Debole

  • dice "mantieni questo finché qualcuno lo indica con forza"
  • la stessa cosa di assegnare, non conservare o rilasciare
  • Un riferimento "debole" è un riferimento che non si mantiene.
  • In genere utilizziamo deboli per IBOutlet (UIViewController's Childs). Questo funziona perché l'oggetto figlio deve esistere solo se l'oggetto padre lo fa.
  • un riferimento debole è un riferimento che non protegge l'oggetto di riferimento dalla raccolta da un garbage collector.
  • Debole è essenzialmente assegnare, una proprietà non trattenuta. Tranne il caso in cui l'oggetto viene deallocato, il puntatore debole viene automaticamente impostato su zero

Esempio :

@property (weak, nonatomic) IBOutlet UIButton *myButton;

@synthesize myButton;

Spiegazione forte e debole, grazie a BJ Homer :

Immagina che il nostro oggetto sia un cane e che il cane voglia scappare (essere disallocato).

Puntatori forti sono come un guinzaglio sul cane. Finché hai il guinzaglio attaccato al cane, il cane non scapperà. Se cinque persone attaccano il loro guinzaglio a un cane, (cinque punti forti a un oggetto), il cane non scapperà finché tutti e cinque i guinzagli non saranno staccati.

Puntatori deboli, d'altra parte, sono come bambini piccoli che puntano il cane e dicono "Guarda! Un cane!" Finché il cane è ancora al guinzaglio, i bambini piccoli possono ancora vedere il cane, e continueranno a indicarlo. Non appena tutti i guinzagli sono staccati, però, il cane scappa non importa quanti bambini piccoli lo stanno indicando.

Non appena l'ultimo puntatore forte (guinzaglio) non punta più su un oggetto, l'oggetto sarà deallocato e tutti i puntatori deboli saranno azzerati.

Quando usiamo debole?

L'unica volta che si vorrebbe usare debole, è se si volesse evitare i cicli di conservazione (ad esempio il genitore conserva il figlio e il figlio conserva il genitore, quindi nessuno dei due viene mai rilasciato).

3.retain = forte

  • viene mantenuto, viene rilasciato il vecchio valore e viene assegnato il mantenimento specifica che il nuovo valore deve essere inviato
  • conservare in assegnazione e il vecchio valore inviato -release
  • mantenere è lo stesso di forte.
  • Apple dice che se si scrive, verrà convertito automaticamente / funzionerà come solo forte.
  • metodi come "alloc" includono un "retain" implicito

Esempio:

@property (nonatomic, retain) NSString *name;

@synthesize name;

4.assign

  • assegna è l'impostazione predefinita e esegue semplicemente un'assegnazione variabile
  • assign è un attributo property che dice al compilatore come sintetizzare l'implementazione setter della proprietà
  • Vorrei usare assegnare per le proprietà primitive C e debole per i riferimenti deboli agli oggetti Objective-C.

Esempio:

@property (nonatomic, assign) NSString *address;

@synthesize address;
Question

Esistono due nuovi attributi di gestione della memoria per le proprietà introdotte da ARC, strong e weak .

Oltre alla copy , che è ovviamente qualcosa di completamente diverso, ci sono delle differenze tra strong vs retain e weak vs assign ?

Da quello che ho capito, l'unica differenza è che weak assegnerà nil al puntatore, mentre assign non lo farà, il che significa che il programma si bloccherà quando invierò un messaggio al puntatore una volta rilasciato. Ma se uso weak , non succederà mai, perché il messaggio inviato a nil non farà nulla.

Non conosco alcuna differenza tra il strong e il retain .

C'è qualche ragione per cui dovrei usare assign e retain in nuovi progetti o il tipo di essere deprecato?




Forte:

  • La proprietà non distruggerà ma solo una volta che si imposta la proprietà su zero l'oggetto verrà distrutto
  • Di default tutte le variabili di istanza e le variabili locali sono potenti puntatori.
  • Si utilizza forte solo se è necessario conservare l'oggetto.
  • Generalmente usiamo forti per UIViewControllers (i genitori degli elementi dell'interfaccia utente)
  • IOS 4 (non ARC) Possiamo usare Retain KeyWord
  • IOS 5 (ARC) Possiamo usare parole chiave forti

Esempio: @property (strong, nonatomic) ViewController * viewController;

@synthesize viewController;

Debole

Per impostazione predefinita, ottenere automaticamente e impostare su zero

  • In genere utilizziamo deboli per IBOutlet (UIViewController's Childs) e delegati
  • la stessa cosa di assegnare, non conservare o rilasciare

Esempio: @property (weak, nonatomic) IBOutlet UIButton * myButton;

@synthesize myButton;




nonatomic / atomica

  • nonatomico è molto più veloce di atomico
  • usa sempre il nonatomico a meno che tu non abbia un requisito molto specifico per l'atomico, che dovrebbe essere raro (atomic non garantisce la sicurezza del thread - blocca solo l'accesso alla proprietà quando è contemporaneamente impostato da un altro thread)

forte / debole / assegnare

  • usa forte per conservare gli oggetti - anche se la parola chiave retain è anche, è meglio usare strong invece
  • usa weak se vuoi solo un puntatore all'oggetto senza conservarlo - utile per evitare i cicli di conservazione (es. delegati) - cancellerà automaticamente il puntatore quando l'oggetto verrà rilasciato
  • usa assign per i primati - esattamente come weak tranne che non annulla l'oggetto quando viene rilasciato (impostato di default)

(Opzionale)

copia

  • usalo per creare una copia superficiale dell'oggetto
  • buona pratica per impostare sempre le proprietà immutabili da copiare - poiché le versioni mutabili possono essere passate in proprietà immutabili, la copia garantirà che avrai sempre a che fare con un oggetto immutabile
  • se un oggetto immutabile viene passato, lo manterrà; se un oggetto mutevole viene passato, lo copierà

sola lettura

  • usalo per disabilitare l'impostazione della proprietà (impedisce la compilazione del codice in caso di infrazione)
  • è possibile modificare ciò che viene consegnato dal getter cambiando la variabile direttamente tramite la sua variabile di istanza o all'interno del metodo getter stesso



Related