Es gibt zwei neue Speicherverwaltungsattribute für Eigenschaften, die von ARC eingeführt wurden, strong
und weak
.
Abgesehen davon copy
, was offensichtlich etwas völlig anderes ist, gibt es Unterschiede zwischen strong
vs retain
und weak
vs assign
?
Nach meinem Verständnis besteht der einzige Unterschied darin, dass der Zeiger weak
zugewiesen wird nil
, während dies assign
nicht der Fall ist. Dies bedeutet, dass das Programm abstürzt, wenn ich eine Nachricht an den Zeiger sende, sobald dieser freigegeben wurde. Aber wenn ich benutze weak
, wird dies niemals passieren, da das Senden von Nachrichten an nil
nichts bewirkt.
Ich kenne keine Unterschiede zwischen strong
und retain
.
Gibt es einen Grund, warum ich assign
und retain
in neuen Projekten verwenden sollte, oder wird die Art von veraltet?
quelle
strong
,weak
undunsafe_unretained
.weak
undstrong
) und 4 variable Lebensdauer Qualifizierer (__strong
,__weak
,__unsafe_unretained
,__autoreleasing
). Siehe die ARC-Hinweise unten.assign
beim Kompilieren mit ARC ein Fehler war. Es gibt viele gelöschte Antworten dazu. Es scheint, dass dies vor der endgültigen Veröffentlichung geändert wurde.unsafe_unretained
ist das bevorzugte Attribut für viele von uns Early Adopters.unsafe_unretained
Einen Beweis dafür, dass es sich um ein gültiges Attribut handelt, finden Sie in Apples "Programmieren mit Objective-C" im Abschnitt "Kapselung von Daten" unter der Überschrift "Verwenden Sie unsichere nicht zurückgehaltene Referenzen für einige Klassen". Was besagt: "Für eine Eigenschaft bedeutet dies die Verwendung des Attributs unsafe_unretained:"Antworten:
Aus den Versionshinweisen zum Übergang zu ARC (das Beispiel im Abschnitt über Eigenschaftsattribute).
So
strong
ist es auchretain
in einer Eigenschaftsdeklaration.Für ARC-Projekte, die ich
strong
anstelle von verwenden würderetain
, würde ichassign
für C-Grundelementeigenschaften undweak
für schwache Verweise auf Objective-C-Objekte verwenden.quelle
assign
für ein Objekt verwendet werden muss. Sie müssen entwederweak
oderunsafe_unretained
(was natürlich unsicher ist) verwenden, wenn Sie die Eigenschaft nicht behalten möchten.assign
Kompiliert für mich in ARC-Projekten mit Deployment Target 4.0.retain
vs.strong
. Ich nehme an, das ist größtenteils harmlos, aber ich stelle mir vor, es solltestrong
aus Gründen der Konsistenz sein ... oder vielleicht spielt es keine Rolle. stackoverflow.com/questions/7796476/…assign
in einigen Fällen noch gültig ist.Nachdem ich so viele Artikel über Stackoverflow-Beiträge und Demoanwendungen gelesen hatte, um die Attribute variabler Eigenschaften zu überprüfen, entschied ich mich, alle Attributinformationen zusammenzufassen:
Unten finden Sie den detaillierten Artikel-Link, über den Sie alle oben genannten Attribute finden, die Ihnen definitiv helfen werden. Vielen Dank an alle, die hier die besten Antworten geben !!
1.strong (iOS4 = behalten)
Beispiel:
2.schwach -
Beispiel:
Starke und schwache Erklärung, danke an BJ Homer :
Wann verwenden wir schwach?
Das einzige Mal, wenn Sie schwach verwenden möchten, ist, wenn Sie Aufbewahrungszyklen vermeiden möchten (z. B. behält der Elternteil das Kind und das Kind behält den Elternteil, sodass keiner jemals freigegeben wird).
3. behalten = stark
Beispiel:
4.zuweisen
Beispiel:
quelle
default
das? Wenn ich es benutze@property (nonatomic) NSString *string
iststrong
? Oderassign
? Weil beide Standardeinstellungen sind.nichtatomar / atomar
stark / schwach / zuweisen
(Optional)
Kopieren
schreibgeschützt
quelle
Soweit ich weiß
strong
undretain
Synonyme sind, tun sie genau das Gleiche.Dann
weak
ist das fast soassign
, wird aber automatisch auf Null gesetzt, nachdem das Objekt, auf das es zeigt, freigegeben wurde.Das heißt, Sie können sie einfach ersetzen.
Es gibt jedoch einen Sonderfall, auf den ich gestoßen bin
assign
, anstattweak
. Nehmen wir an, wir haben zwei EigenschaftendelegateAssign
unddelegateWeak
. In beiden ist unser Delegierter gespeichert, der uns besitzt, indem er die einzige starke Referenz hat. Der Delegat gibt die Zuordnung auf, daher wird auch unsere-dealloc
Methode aufgerufen.Der Delegat befindet sich bereits im Freigabeprozess, ist jedoch noch nicht vollständig freigegeben. Das Problem ist, dass
weak
Verweise auf ihn bereits ungültig sind! Die EigenschaftdelegateWeak
enthält null,delegateAssign
enthält jedoch ein gültiges Objekt (wobei alle Eigenschaften bereits freigegeben und ungültig sind, aber noch gültig sind).Es ist ein ganz besonderer Fall, aber es zeigt uns, wie diese
weak
Variablen funktionieren und wann sie aufgehoben werden.quelle
In Clangs Dokument zur automatischen Zählung von Objective-C (ARC) werden die Eigentumsqualifikatoren und Modifikatoren klar erläutert:
Dann gibt es sechs Eigentumsmodifikatoren für deklariertes Eigentum:
In Bezug auf die Semantik haben die Eigentumsqualifizierer in den fünf verwalteten Vorgängen unterschiedliche Bedeutung : Lesen, Zuweisen, Initialisieren, Zerstören und Verschieben, wobei wir uns meistens nur um den Unterschied im Zuweisungsvorgang kümmern.
Der andere Unterschied zwischen Lesen, Init, Zerstörung und Verschieben finden Sie in Abschnitt 4.2 Semantik im Dokument .
quelle
Angenommen, wir haben eine Methode mit dem Namen displayLocalVariable, um die Referenz zu Strong and Weak zu verstehen.
Im obigen Methodenbereich ist der Gültigkeitsbereich der Variablen myName auf die Methode displayLocalVariable beschränkt. Sobald die Methode abgeschlossen ist, wird die Variable myName, die die Zeichenfolge "ABC" enthält, aus dem Speicher freigegeben.
Was ist nun, wenn wir den Wert der Variablen myName während unseres gesamten Lebenszyklus des View Controllers beibehalten möchten? Zu diesem Zweck können wir die als Benutzername bezeichnete Eigenschaft erstellen, die einen starken Verweis auf die Variable myName (siehe
self.username = myName;
Code unten) enthält.Jetzt können Sie im obigen Code sehen, dass myName self.username zugewiesen wurde und self.username einen starken Verweis (wie wir in der Schnittstelle mit @property deklariert haben) auf myName hat (indirekt hat es einen starken Verweis auf die Zeichenfolge "ABC"). Daher wird der String myName erst dann aus dem Speicher freigegeben, wenn self.username aktiv ist.
Erwägen Sie nun, myName dummyName zuzuweisen, was eine schwache Referenz ist. Self.dummyName = myName; Im Gegensatz zu starker Referenz hält Weak den myName nur so lange, bis eine starke Referenz auf myName vorhanden ist. Siehe folgenden Code, um die schwache Referenz zu verstehen.
Im obigen Code gibt es einen schwachen Verweis auf myName (dh self.dummyName hat einen schwachen Verweis auf myName), aber es gibt keinen starken Verweis auf myName, daher kann self.dummyName den myName-Wert nicht halten.
Betrachten Sie nun noch einmal den folgenden Code:
Im obigen Code hat self.username einen starken Verweis auf myName, daher hat self.dummyName jetzt auch nach dem Ende der Methode den Wert myName, da myName 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 nicht freigegeben. Die Anzahl der Aufbewahrungen erreicht 0.
Hoffe das hilft.
quelle
Stark:
Beispiel: @property (stark, nichtatomar) ViewController * viewController;
@synthesize viewController;
Schwach
Standardmäßig automatisch abrufen und auf Null setzen
Beispiel: @property (schwach, nichtatomar) IBOutlet UIButton * myButton;
@synthesize myButton;
quelle
Die Unterschiede zwischen stark und behalten:
Die Unterschiede zwischen schwach und zuordnen:
quelle