Sono nuovo di Obj-C, quindi la mia prima domanda è:
Quali sono le differenze tra strong
e weak
nelle @property
dichiarazioni di puntatori agli oggetti?
Inoltre, cosa nonatomic
significa?
Sono nuovo di Obj-C, quindi la mia prima domanda è:
Quali sono le differenze tra strong
e weak
nelle @property
dichiarazioni di puntatori agli oggetti?
Inoltre, cosa nonatomic
significa?
Risposte:
Un riferimento forte (che utilizzerai nella maggior parte dei casi) significa che vuoi "possedere" l'oggetto a cui fai riferimento con questa proprietà / variabile. Il compilatore farà in modo che qualsiasi oggetto assegnato a questa proprietà non venga distrutto fintanto che lo punti con un riferimento forte. Solo una volta impostata la proprietà nil
, l'oggetto verrà distrutto (a meno che uno o più altri oggetti non contengano un forte riferimento ad esso).
Al contrario, con un riferimento debole si intende che non si desidera avere il controllo sulla durata dell'oggetto. L'oggetto a cui si fa riferimento debolmente vive solo perché almeno un altro oggetto ha un forte riferimento ad esso. Una volta che non è più così, l'oggetto viene distrutto e la tua proprietà debole verrà automaticamente impostata su nil
. I casi d'uso più frequenti di riferimenti deboli in iOS sono:
delegare le proprietà, a cui spesso si fa riferimento debolmente per evitare cicli di mantenimento, e
sottoview / controlli della vista principale di un controller di visualizzazione perché tali visualizzazioni sono già fortemente gestite dalla vista principale.
atomic vs. nonatomic si riferisce alla sicurezza del thread dei metodi getter e setter che il compilatore sintetizza per la proprietà. atomic (impostazione predefinita) dice al compilatore di rendere i metodi accessor thread-safe (aggiungendo un blocco prima dell'accesso a un ivar) e nonatomic fa il contrario. Il vantaggio di nonatomic è una prestazione leggermente superiore. Su iOS, Apple utilizza nonatomic per quasi tutte le loro proprietà, quindi il consiglio generale è che tu faccia lo stesso.
atomic
garantisce che la proprietà possa essere letta e scritta in sicurezza da più thread contemporaneamente. Ciò non significa che un oggetto le cui proprietà sono tutte atomic
sia automaticamente thread-safe.
Può essere utile pensare a riferimenti forti e deboli in termini di palloncini.
Un pallone non volerà via fintanto che almeno una persona si aggrappi a una corda attaccata ad esso. Il numero di persone in possesso di stringhe è il conteggio dei ritardi. Quando nessuno si tiene aggrappato a una corda, il pallone volerà via (dealloc). Molte persone possono avere stringhe per lo stesso pallone. È possibile ottenere / impostare proprietà e chiamare metodi sull'oggetto referenziato con riferimenti sia forti che deboli.
Un riferimento forte è come aggrapparsi a una stringa di quel pallone. Finché tieni premuto su una corda attaccata al palloncino, non volerà via.
Un riferimento debole è come guardare il palloncino. Puoi vederlo, accedere alle sue proprietà, chiamare i suoi metodi, ma non hai una stringa per quel fumetto. Se tutti si tengono sulla corda, la mongolfiera vola via e non puoi più accedervi.
strong
e in weak
realtà significhi.
strong : gli assegna il valore in entrata, manterrà il valore in entrata e rilascerà il valore esistente della variabile di istanza
debole : gli assegnerà il valore in entrata senza conservarlo.
Quindi la differenza di base è il mantenimento della nuova variabile. Generalmente si desidera mantenerlo ma ci sono situazioni in cui non si desidera averlo altrimenti si otterrà un ciclo di mantenimento e non sarà possibile liberare la memoria degli oggetti. Per esempio. obj1 mantiene obj2 e obj2 mantiene obj1. Per risolvere questo tipo di situazione usi riferimenti deboli.
Una risposta fittizia: -
Penso che la spiegazione sia data nella risposta sopra, quindi ti dirò solo dove usare STRONG
e dove usare WEAK
:
Utilizzo di Weak
: -
1. Delegati 2. Punti vendita 3. Sottoview 4. Controlli, ecc.
Uso di Strong
: -
Rimanendo ovunque che non è incluso in WEAK
.
forte e debole , queste parole chiave ruotano attorno alla proprietà dell'oggetto in Objective-C
Che cos'è la proprietà dell'oggetto?
Le variabili puntatore implicano la proprietà degli oggetti a cui puntano.
Ogni volta che una variabile puntatore punta a un oggetto, quell'oggetto ha un proprietario e rimarrà in vita. Questo è noto come un forte riferimento.
Facoltativamente, una variabile non può assumere la proprietà di un oggetto a cui punta. Una variabile che non diventa proprietaria di un oggetto è conosciuta come riferimento debole .
Dai un'occhiata a una spiegazione dettagliata qui Demistificando @ proprietà e gli attributi
Qui, la documentazione di Apple ha spiegato la differenza tra proprietà debole e forte usando vari esempi:
Qui, in questo blog l'autore ha raccolto tutte le proprietà nello stesso posto. Aiuterà a confrontare le caratteristiche delle proprietà:
http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html
forte è il valore predefinito. Un oggetto rimane "vivo" fintanto che è presente un forte indicatore.
debole specifica un riferimento che non mantiene in vita l'oggetto di riferimento. Un riferimento debole è impostato su zero quando non ci sono riferimenti forti all'oggetto.
Per capire il riferimento forte e debole, considera l'esempio che segue, supponiamo di avere un metodo chiamato displayLocalVariable.
-(void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
}
Nell'ambito del metodo sopra, l'ambito della variabile myView è limitato al metodo displayLocalVariable, una volta terminato il metodo, la variabile myView che contiene l'oggetto UIView verrà deallocata dalla memoria.
Ora, se vogliamo mantenere la variabile myView per tutto il ciclo di vita del nostro controller di visualizzazione. Per questo possiamo creare la proprietà denominata come usernameView che avrà un forte riferimento alla variabile myView (vedi @property(nonatomic,strong) UIView* usernameView;
e self.usernameView = myView;
nel codice sotto), come sotto,
@interface LoginViewController ()
@property(nonatomic,strong) UIView* usernameView;
@property(nonatomic,weak) UIView* dummyNameView;
- (void)displayLocalVariable;
@end
@implementation LoginViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
-(void)viewWillAppear:(BOOL)animated
{
[self displayLocalVariable];
}
- (void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
self.usernameView = myView;
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
@end
Ora nel codice sopra puoi vedere myView è stato assegnato a self.usernameView e self.usernameView sta avendo un forte riferimento (come abbiamo dichiarato nell'interfaccia usando @property) a myView. Quindi myView non verrà deallocato dalla memoria fino a quando self.usernameView è attivo.
Ora considera di assegnare myName a dummyNameView che è un riferimento debole, a self.dummyNameView = myView;
differenza del riferimento forte Debole manterrà myView solo fino a quando non ci sarà un riferimento forte a myView. Vedi sotto il codice per capire il riferimento debole,
-(void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
self.dummyNameView = myView;
}
Nel codice sopra c'è un riferimento debole a myView (cioè self.dummyNameView ha un riferimento debole a myView) ma non c'è un riferimento forte a myView, quindi self.dummyNameView non sarà in grado di contenere il valore myView.
Ora considera di nuovo il codice seguente,
-(void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
self.usernameView = myView;
self.dummyNameView = myView;
}
Nel codice sopra self.usernameView ha un riferimento forte a myView, quindi self.dummyNameView ora avrà un valore di myView anche dopo la fine del metodo poiché a myView è associato un riferimento forte.
Ora, ogni volta che facciamo un riferimento forte a una variabile, il suo conteggio di mantenimento viene aumentato di uno e la variabile non verrà deallocata finché il suo conteggio di mantenimento non raggiungerà 0.
Spero che questo ti aiuti.
Forte : fondamentalmente usato con le proprietà che usavamo per ottenere o inviare dati da / in altre classi. Debole : in genere tutte le prese, le connessioni sono di tipo debole dall'interfaccia.
Non anatomico : questo tipo di proprietà viene utilizzato in condizioni in cui non vogliamo condividere il nostro outlet o oggetto in diversi thread simultanei. In altre parole, l'istanza Nonatomic rende le nostre proprietà per gestire un thread alla volta. Spero che sia utile per te.