Unterschiede zwischen stark und schwach in Ziel-C

308

Ich bin neu bei Obj-C, daher lautet meine erste Frage:

Was sind die Unterschiede zwischen strongund weakin @propertyDeklarationen von Zeigern auf Objekte?

Was bedeutet nonatomicdas auch?

Mark Pegasov
quelle
19
Eigentlich ist dies eine gute Frage, manchmal haben wir vergessen, wie das Grundkonzept der starken / schwachen und atomaren / nichtatomaren Präferenzen ... :) Danke, dass Sie uns daran erinnert haben ...
Andikurnia
10
@JackyBoy Was lustig ist, ist, dass die vorgeschlagene einfache Suche auf Google mich hierher führt lol. #Circularreference
Jason Renaldo
10
Ich neige dazu, vielen Antworten auf Google nicht zu vertrauen, beziehe
mich

Antworten:

642

Eine starke Referenz (die Sie in den meisten Fällen verwenden) bedeutet, dass Sie das Objekt, auf das Sie verweisen, mit dieser Eigenschaft / Variablen "besitzen" möchten. Der Compiler sorgt dafür, dass alle Objekte, die Sie dieser Eigenschaft zuweisen, nicht zerstört werden, solange Sie mit einem starken Verweis darauf verweisen. Erst wenn Sie die Eigenschaft auf setzen, nilwird das Objekt zerstört (es sei denn, ein oder mehrere andere Objekte enthalten ebenfalls einen starken Verweis darauf).

Im Gegensatz dazu bedeuten Sie mit einer schwachen Referenz, dass Sie keine Kontrolle über die Lebensdauer des Objekts haben möchten. Das Objekt, auf das Sie schwach verweisen, lebt nur weiter, weil mindestens ein anderes Objekt einen starken Verweis darauf enthält. Sobald dies nicht mehr der Fall ist, wird das Objekt zerstört und Ihre schwache Eigenschaft wird automatisch auf gesetzt nil. Die häufigsten Anwendungsfälle schwacher Referenzen in iOS sind:

  1. delegieren Sie Eigenschaften, auf die häufig nur schwach verwiesen wird, um Aufbewahrungszyklen zu vermeiden, und

  2. Unteransichten / Steuerelemente der Hauptansicht eines Ansichtscontrollers, da diese Ansichten bereits stark von der Hauptansicht gehalten werden.

Atomic vs. Nonatomic bezieht sich auf die Thread-Sicherheit der Getter- und Setter-Methoden, die der Compiler für die Eigenschaft synthetisiert. atomic (Standardeinstellung) weist den Compiler an, die Zugriffsmethoden threadsicher zu machen (indem eine Sperre hinzugefügt wird, bevor auf einen ivar zugegriffen wird), und nonatomic macht das Gegenteil. Der Vorteil von nichtatomar ist eine etwas höhere Leistung. Unter iOS verwendet Apple für fast alle Eigenschaften nichtatomare Elemente. Daher wird allgemein empfohlen, dasselbe zu tun.

Ole Begemann
quelle
28
@Bourne: Das hängt davon ab, was Sie unter Thread-Sicherheit verstehen. atomicgarantiert, dass die Eigenschaft sicher von mehreren Threads gleichzeitig gelesen und geschrieben werden kann. Dies bedeutet nicht, dass ein Objekt, dessen Eigenschaften alle atomicsind, automatisch threadsicher ist.
Ole Begemann
3
Tolle Details. Ich glaube, ich habe es bis jetzt nicht wirklich verstanden. Vielen Dank.
Ahmedalkaff
1
Gemäß der Apple-Dokumentation sollten atomar und nichtatomar gleichbedeutend mit Thread-Sicherheit sein. developer.apple.com/library/ios/documentation/cocoa/conceptual/…
Murtaza Khursheed Hussain
5
"Hinweis: Die Atomizität von Eigenschaften ist nicht gleichbedeutend mit der Thread-Sicherheit eines Objekts." developer.apple.com/library/ios/documentation/cocoa/conceptual/…
GS
Warum löschen wir die Instanz nicht einfach, wenn wir nicht wollen? Warum können wir nicht einfach die Luft aus dem Ballon nehmen oder ihn zerstören, wenn wir nicht wollen, warum müssen wir uns um die angebrachten Saiten kümmern? Wir brauchen nur Daten.
Ashish Pisey
707

Es kann hilfreich sein, über starke und schwache Referenzen in Bezug auf Luftballons nachzudenken.

Ein Ballon fliegt nicht weg, solange sich mindestens eine Person an einer daran befestigten Schnur festhält. Die Anzahl der Personen, die Zeichenfolgen halten, ist die Anzahl der Beibehaltungen. Wenn sich niemand an einer Schnur festhält, fliegt der Ballon weg (Dealloc). Viele Menschen können Saiten an demselben Ballon haben. Sie können Eigenschaften und Aufrufmethoden für das referenzierte Objekt mit starken und schwachen Referenzen abrufen / festlegen.

Ein starker Bezug ist wie das Festhalten an einer Schnur an diesem Ballon. Solange Sie sich an einer am Ballon befestigten Schnur festhalten, fliegt diese nicht weg.

Eine schwache Referenz ist wie ein Blick auf den Ballon. Sie können es sehen, auf seine Eigenschaften zugreifen, seine Methoden aufrufen, aber Sie haben keine Zeichenfolge für diese Sprechblase. Wenn alle, die sich an der Schnur festhalten, loslassen, fliegt der Ballon weg und Sie können nicht mehr darauf zugreifen.

MJN
quelle
68
+2 (wenn ich nur könnte). Ernsthaft, wirklich kreative Erklärung!
Con Antonakos
25
Nach anderthalb Jahren iOS-Entwicklung habe ich gerade klar verstanden, was strongund was es weakeigentlich bedeutet.
Isuru
17
@ X.Li Retain-Zyklus ist so, als hätten Sie 2 Saiten zum Ballon, eine davon gehört Ihnen (also besitzen Sie diesen Ballon), die andere gehört dem Ballon (also gehört Ihnen dieser Ballon). Wie können Sie den Ballon loslassen, wenn der Ballon nicht gehen möchte, da Sie nur Zugriff auf Ihre Saite haben? Es ist also besser, wenn Sie den Ballon besitzen (stark), während der Ballon Sie nicht besitzt (schwach). Wenn Sie es loslassen möchten, schneiden Sie einfach die Schnur :)
snakeninny
5
Lesen Sie sein Profil, er ist ein iOS-Lehrer. Sehr kreative Erklärung !! Hut ab :)
Hemang
3
Atomic vs Non-Atomic Ich denke, kann als öffentlicher Toilettenraum mit mehreren Türen beschrieben werden, mit einer Toilette in der Mitte. Sobald jemand durch eine Tür in die Toilette kommt, kann er genauso gut alle anderen Türen in die Toilette einschließen, wenn er keinen Moment der Unbeholfenheit erleben möchte. Lol. Vielen Dank, dass Sie diese Unsinn-Analogie gelesen haben.
Chen Li Yong
24

strong : Weist ihm den eingehenden Wert zu, behält den eingehenden Wert bei und gibt den vorhandenen Wert der Instanzvariablen frei

schwach : Weist ihm den eingehenden Wert zu, ohne ihn beizubehalten.

Der grundlegende Unterschied besteht also darin, die neue Variable beizubehalten. Im Allgemeinen möchten Sie es behalten, aber es gibt Situationen, in denen Sie es nicht haben möchten, da Sie sonst einen Aufbewahrungszyklus erhalten und den Speicher der Objekte nicht freigeben können. Z.B. obj1 behält obj2 und obj2 behält obj1. Um diese Situation zu lösen, verwenden Sie schwache Referenzen.

Pfitz
quelle
12

Eine Scheinantwort: -

Ich denke, die obige Antwort enthält eine Erklärung, daher werde ich Ihnen nur sagen, wo STRONGund wo Sie sie verwenden sollen WEAK:

Verwendung von Weak: - 1. Delegierten 2. Steckdosen 3. Unteransichten 4. Steuerelementen usw.

Verwendung von Strong: - Überall bleiben, was nicht in enthalten ist WEAK.

Shubham Mishra
quelle
2
Und was enthält usw.: P
Rajneesh071
3
WebView, MapView usw.
Shubham Mishra
4
Eigentlich der größte Teil der Unteransicht, die wir per Drag & Drop auf das Storyboard ziehen
Shubham Mishra
8

Diese Schlüsselwörter sind stark und schwach und drehen sich um Objektbesitz in Objective-C

Was ist Objektbesitz?

Zeigervariablen implizieren den Besitz der Objekte, auf die sie zeigen.

  • Wenn eine Methode (oder Funktion) eine lokale Variable hat, die auf ein Objekt zeigt, wird diese Variable als Eigentümerin des Objekts bezeichnet, auf das verwiesen wird.
  • Wenn ein Objekt eine Instanzvariable hat, die auf ein anderes Objekt zeigt, soll das Objekt mit dem Zeiger das Objekt besitzen, auf das gezeigt wird.

Immer wenn eine Zeigervariable auf ein Objekt zeigt, hat dieses Objekt einen Eigentümer und bleibt am Leben. Dies ist als starke Referenz bekannt.

Eine Variable kann optional kein Eigentum an einem Objekt übernehmen, auf das sie zeigt. Eine Variable, die kein Objekt besitzt, wird als schwache Referenz bezeichnet.

Hier finden Sie eine ausführliche Erklärung. Entmystifizierung von @ Eigenschaften und Attributen

Vinay Jain
quelle
6

Hier hat Apple Documentation den Unterschied zwischen schwachen und starken Eigenschaften anhand verschiedener Beispiele erläutert:

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

Hier in diesem Blog hat der Autor alle Eigenschaften an derselben Stelle gesammelt. Es wird helfen, Eigenschaften Eigenschaften zu vergleichen:

http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html

Subhash Kumar Singh
quelle
6

stark ist die Standardeinstellung. Ein Objekt bleibt „lebendig“, solange es einen starken Zeiger darauf gibt.

schwach gibt eine Referenz an, die das referenzierte Objekt nicht am Leben erhält. Eine schwache Referenz wird auf Null gesetzt, wenn keine starken Referenzen auf das Objekt vorhanden sind.

Ankit Vyas
quelle
2

Angenommen, wir haben eine Methode mit dem Namen displayLocalVariable, um die Referenz zu Strong and Weak zu verstehen.

 -(void)displayLocalVariable
  {
     UIView* myView = [[UIView alloc] init];
     NSLog(@"myView tag is = %ld", myView.tag);
  }

Im obigen Methodenbereich ist der Umfang der myView-Variablen auf die displayLocalVariable-Methode beschränkt. Sobald die Methode abgeschlossen ist, wird die Zuordnung der myView-Variablen, die das UIView-Objekt enthält, aus dem Speicher freigegeben.

Was ist nun, wenn wir die Variable myView während des gesamten Lebenszyklus unseres View Controllers behalten möchten? Zu diesem Zweck können wir die Eigenschaft usernameView erstellen, die einen starken Verweis auf die Variable myView enthält (siehe @property(nonatomic,strong) UIView* usernameView;und self.usernameView = myView;im folgenden Code).

@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

Jetzt können Sie im obigen Code sehen, dass myView self.usernameView zugewiesen wurde und self.usernameView einen starken Verweis (wie wir in der Schnittstelle mit @property deklariert haben) auf myView hat. Daher wird myView erst dann aus dem Speicher freigegeben, wenn self.usernameView aktiv ist.

  • Schwache Referenz

Erwägen Sie nun, myName dummyNameView zuzuweisen, was eine schwache Referenz ist. self.dummyNameView = myView;Im Gegensatz zu einer starken Referenz hält Schwach die myView nur so lange, bis eine starke Referenz auf myView vorhanden ist. Siehe folgenden Code, um die schwache Referenz zu verstehen.

-(void)displayLocalVariable
  {
     UIView* myView = [[UIView alloc] init];
     NSLog(@"myView tag is = %ld", myView.tag);
     self.dummyNameView = myView;
  }

Im obigen Code gibt es einen schwachen Verweis auf myView (dh self.dummyNameView hat einen schwachen Verweis auf myView), aber es gibt keinen starken Verweis auf myView, daher kann self.dummyNameView den myView-Wert nicht halten.

Betrachten Sie nun noch einmal den folgenden Code:

-(void)displayLocalVariable
      {
         UIView* myView = [[UIView alloc] init];
         NSLog(@"myView tag is = %ld", myView.tag);
         self.usernameView = myView;
         self.dummyNameView = myView;
      } 

Im obigen Code hat self.usernameView einen starken Verweis auf myView, daher hat self.dummyNameView jetzt auch nach dem Ende der Methode den Wert myView, da myView einen starken Verweis zugeordnet ist.

Wenn wir jetzt einen starken Verweis auf eine Variable machen, wird die Anzahl der Aufbewahrungen um eins erhöht und die Variable wird erst freigegeben, wenn die Anzahl der Aufbewahrungen 0 erreicht.

Hoffe das hilft.

Mahadev Mandale
quelle
2019-07-25 12: 33: 15.479002 + 0530 StrongAndWeak [6329: 245483] Mein Name ist = ABC 2019-07-25 12: 33: 15.479226 + 0530 StrongAndWeak [6329: 245483] Mein Name ist für strong = ABC 2019- 07-25 12: 33: 15.479418 + 0530 StrongAndWeak [6329: 245483] Mein Name ist für schwach = ABC. Hier haben Sie gesagt, dass eine schwache Eigenschaft keinen Wert für meinen Namen hat. Aber ich erhalte meinen Namen als ABC für beide Referenzen.
Können
@ Raviteja_DevObal ARC verspricht nicht, es sofort zu tun (dh die Zuordnung der Zeichenfolge @ "ABC" aufheben), aber es wird später sicher freigegeben ...
Mahadev Mandale
@Raviteja_DevObal Wie hier erklärt, sind Strings ein schlechtes Beispiel dafür. Ich habe meine Antwort mit dem UIView-Objekt aktualisiert und hoffe, dass es hilft.
Mahadev Mandale
1

Stark : Grundsätzlich verwendet Mit Eigenschaften haben wir Daten von / in andere Klassen abgerufen oder gesendet. Schwach : Normalerweise sind alle Steckdosen und Verbindungen vom Interface-Typ schwach.

Nichtatomar : Solche Eigenschaften werden unter Bedingungen verwendet, unter denen wir unseren Ausgang oder unser Objekt nicht in verschiedene gleichzeitige Threads teilen möchten. Mit anderen Worten, die nichtatomare Instanz bewirkt, dass unsere Eigenschaften jeweils einen Thread behandeln. Hoffentlich hilfreich für Sie.

Joga singh
quelle