Ich bin neu bei Obj-C, daher lautet meine erste Frage:
Was sind die Unterschiede zwischen strong
und weak
in @property
Deklarationen von Zeigern auf Objekte?
Was bedeutet nonatomic
das auch?
Ich bin neu bei Obj-C, daher lautet meine erste Frage:
Was sind die Unterschiede zwischen strong
und weak
in @property
Deklarationen von Zeigern auf Objekte?
Was bedeutet nonatomic
das auch?
Antworten:
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, nil
wird 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:
delegieren Sie Eigenschaften, auf die häufig nur schwach verwiesen wird, um Aufbewahrungszyklen zu vermeiden, und
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.
atomic
garantiert, dass die Eigenschaft sicher von mehreren Threads gleichzeitig gelesen und geschrieben werden kann. Dies bedeutet nicht, dass ein Objekt, dessen Eigenschaften alle atomic
sind, automatisch threadsicher ist.
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.
strong
und was es weak
eigentlich bedeutet.
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.
Eine Scheinantwort: -
Ich denke, die obige Antwort enthält eine Erklärung, daher werde ich Ihnen nur sagen, wo STRONG
und 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
.
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.
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
Hier hat Apple Documentation den Unterschied zwischen schwachen und starken Eigenschaften anhand verschiedener Beispiele erläutert:
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
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.
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.
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.
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.