Differenze tra forte e debole in Obiettivo-C


308

Sono nuovo di Obj-C, quindi la mia prima domanda è:

Quali sono le differenze tra stronge weaknelle @propertydichiarazioni di puntatori agli oggetti?

Inoltre, cosa nonatomicsignifica?


19
in realtà questa è una buona domanda, a volte, abbiamo dimenticato come il concetto di base di preferenze forti / deboli e atomiche / nonatomiche .... :) Grazie per
avercelo

10
@JackyBoy La cosa divertente è che la semplice ricerca proposta su Google mi porta qui lol. #circularreference
Jason Renaldo,

10
Tendo a non fidarmi di molte delle risposte su Google, ma mi riferisco sempre a SO per risposte intelligenti
JeffK,

Risposte:


642

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:

  1. delegare le proprietà, a cui spesso si fa riferimento debolmente per evitare cicli di mantenimento, e

  2. 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.


28
@ Bourne: dipende da cosa intendi per sicurezza del thread. atomicgarantisce 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 atomicsia automaticamente thread-safe.
Ole Begemann,

3
Grandi dettagli. Penso di non averlo capito fino ad ora. Grazie.
ahmedalkaff,

1
Come da documentazione Apple, atomico e non anatomico dovrebbero essere sinonimo di sicurezza del filo. developer.apple.com/library/ios/documentation/cocoa/conceptual/…
Murtaza Khursheed Hussain

5
"Nota: l'atomicità delle proprietà non è sinonimo di sicurezza del thread di un oggetto." developer.apple.com/library/ios/documentation/cocoa/conceptual/…
GS

perché non eliminiamo semplicemente l'istanza quando non vogliamo? Perché non possiamo semplicemente togliere l'aria dal palloncino o distruggerlo quando non vogliamo, perché dobbiamo preoccuparci delle corde attaccate? Abbiamo solo bisogno di dati.
Ashish Pisey,

707

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.


68
+2 (se solo potessi). Seriamente, spiegazione davvero creativa!
Con Antonakos,

25
Dopo 1 anno e mezzo di sviluppo iOS, penso che in questo momento ho capito chiaramente cosa stronge in weakrealtà significhi.
Isuru,

17
@ X.Li Il ciclo di mantenimento è come se tu avessi 2 stringhe al ballon, una di esse è di tua proprietà (quindi possiedi questo ballon), l'altra è di proprietà del ballon (quindi questo ballon ti possiede). Dato che hai accesso solo alla tua corda, come lasci andare l'impulso se l'impulso non vuole andare? Quindi è meglio possedere il ballon (forte) mentre il ballon non ti possiede (debole). Quando vuoi lasciarlo andare, basta tagliare la corda :)
snakeninny il

5
Leggi il suo profilo, è un istruttore iOS. Spiegazione molto creativa !!
Tanto di

3
Atomic vs non atomic Penso che possa essere descritto come un bagno pubblico con più porte, con un bagno al centro. Una volta che qualcuno entra nel gabinetto attraverso una porta, potrebbe anche chiudere a chiave tutte le altre porte nel gabinetto se non vuole sperimentare un momento di imbarazzo. Lol. Grazie per aver letto questa analogia senza senso.
Chen Li Yong

24

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.


12

Una risposta fittizia: -

Penso che la spiegazione sia data nella risposta sopra, quindi ti dirò solo dove usare STRONGe 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.


2
E cosa contiene ecc: P
Rajneesh071,

3
webView, mapView, ecc.
Shubham Mishra,

4
in realtà la maggior parte della sottoview che trasciniamo sullo storyboard
shubham mishra,

8

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.

  • Quando un metodo (o una funzione) ha una variabile locale che punta a un oggetto, si dice che quella proprietà possiede l'oggetto a cui si punta.
  • Quando un oggetto ha una variabile di istanza che punta a un altro oggetto, si dice che l'oggetto con il puntatore possiede l'oggetto a cui punta.

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


6

Qui, la documentazione di Apple ha spiegato la differenza tra proprietà debole e forte usando vari esempi:

https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html#//apple_ref/doc/uid/TP40011210-CH5-SW3

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


6

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.


2

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.

  • Riferimento debole

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.


25-07-2019 12: 33: 15.479002 + 0530 StrongAndWeak [6329: 245483] My name is = ABC 2019-07-25 12: 33: 15.479226 + 0530 StrongAndWeak [6329: 245483] Il mio nome è for strong = ABC 2019- 07-25 12: 33: 15.479418 + 0530 StrongAndWeak [6329: 245483] Il mio nome è per debole = ABC in questo hai detto che la proprietà debole non ha valore del mio nome. Ma sto ottenendo il valore del mio nome come ABC per entrambi i riferimenti. ..? puoi dare una risposta più chiara .... Grazie in anticipo
Madhu_Nani il

@Raviteja_DevObal ARC non promette di farlo immediatamente (cioè deallocare la stringa @ "ABC"), ma verrà sicuramente deallocato in seguito ...
Mahadev Mandale

@Raviteja_DevObal Come spiegato qui le stringhe ne sono un cattivo esempio. Ho aggiornato la mia risposta con l'oggetto UIView, spero che sia d'aiuto.
Mahadev Mandale,

1

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.