Was ist der Unterschied zwischen schwachen und starken Eigenschaftensetzerattributen in Objective-C?
@property(retain, [weak/strong]) __attribute__((NSObject)) CFDictionaryRef myDictionary;
Was ist die Auswirkung und der Nutzen?
Ich habe gehört, dass schwach unter iOS 4 nicht verfügbar ist und wir Assign verwenden müssen.
Ist schwach ähnlich zuzuweisen?
Antworten:
Sie haben entweder ARC für eine bestimmte Datei aktiviert oder deaktiviert. Wenn es aktiviert ist, können Sie nicht
retain
release
autorelease
etc ... verwenden. Stattdessen verwenden Siestrong
weak
für Eigenschaften oder__strong
__weak
für Variablen (standardmäßig__strong
). Stark ist das Äquivalent zum Beibehalten, ARC verwaltet die Veröffentlichung jedoch für Sie.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).
Der Teil "gebührenfreie Überbrückung" (Casting von
NS
bisCF
) ist etwas schwierig. Sie haben noch manuell verwaltenCFRelease()
undCFRetain()
für CF - Objekte. Wenn Sie sie wieder in NS-Objekte konvertieren, müssen Sie dem Compiler die Anzahl der Aufbewahrungen mitteilen, damit er weiß, was Sie getan haben.Es ist alles hier .
quelle
Hier finden Sie Informationen zu den Eigenschaften von Variablen
Im Folgenden finden Sie den detaillierten Artikel-Link, über den Sie alle oben genannten Attribute finden, die Ihnen trotzig helfen werden. Vielen Dank an alle, die hier die besten Antworten geben !!
01. stark (iOS4 = beibehalten) - es heißt " Behalte dies auf dem Haufen, bis ich nicht mehr darauf zeige" - mit anderen Worten "Ich bin der Besitzer, du kannst dies nicht freigeben, bevor du gut mit dem gleichen Ziel wie" Behalten "zielst "- Sie verwenden strong nur, wenn Sie das Objekt behalten müssen. - Standardmäßig sind alle Instanzvariablen und lokalen Variablen starke Zeiger. - Wir verwenden im Allgemeinen strong für UIViewController (die Eltern des UI-Elements). - strong wird mit ARC verwendet und hilft Ihnen im Grunde, indem Sie sich nicht um die Anzahl der Objekte kümmern müssen. ARC gibt es automatisch für Sie frei, wenn Sie damit fertig sind. Wenn Sie das Schlüsselwort strong verwenden, bedeutet dies, dass Sie das Objekt besitzen.
Beispiel:
02. schwach (iOS4 = unsafe_unretained) - es heißt " Behalte dies, solange jemand anderes stark darauf hinweist" - dasselbe wie Zuweisen, kein Zurückhalten oder Freigeben - Eine "schwache" Referenz ist eine Referenz, die du nicht behältst. - Wir verwenden im Allgemeinen schwach für IBOutlets (UIViewController's Childs). Dies funktioniert, weil das untergeordnete Objekt nur so lange existieren muss, wie das übergeordnete Objekt. - Eine schwache Referenz ist eine Referenz, die das referenzierte Objekt nicht vor der Sammlung durch einen Garbage Collector schützt. - Schwach ist im Wesentlichen zuzuweisen, eine nicht zurückgehaltene Eigenschaft. Außer wenn das Objekt freigegeben wird, wird der schwache Zeiger automatisch auf Null gesetzt
Beispiel:
Erklären Sie : Danke an BJ Homer
Stellen Sie sich vor, unser Objekt ist ein Hund und der Hund möchte weglaufen (freigegeben werden). Starke Zeiger sind wie eine Leine am Hund. Solange Sie die Leine am Hund befestigt haben, rennt der Hund nicht weg. Wenn fünf Personen ihre Leine an einem Hund befestigen (fünf starke Zeiger auf ein Objekt), rennt der Hund nicht weg, bis alle fünf Leinen gelöst sind. Schwache Zeiger hingegen sind wie kleine Kinder, die auf den Hund zeigen und sagen: "Schau! Ein Hund!" Solange der Hund noch an der Leine ist, können die kleinen Kinder den Hund noch sehen und sie werden immer noch darauf zeigen. Sobald jedoch alle Leinen gelöst sind, rennt der Hund weg, egal wie viele kleine Kinder darauf zeigen. Sobald der letzte starke Zeiger (Leine) nicht mehr auf ein Objekt zeigt, wird die Zuordnung des Objekts aufgehoben und alle schwachen Zeiger werden auf Null gesetzt. 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).
quelle
strong=retain
undassign
als Standardeinstellungen gekennzeichnet, aber es kann nicht beides sein.weak
undstrong
in Ihren Beispielen verlegt haben. Wäre es nicht sinnvoller, wenn ein Elternteilstrong
Verweise auf seine Kinder hat (als diemyButton
Eigenschaft derUIViewController
Klasse, die Sie gezeigt habenweak
) und dass die Kinderweak
Verweise auf ihre Eltern behalten (wie dieviewController
Eigenschaft einer Kinderklasse, die Sie ' ve stattdessen aufstrong
) gesetzt. Wenn er zum Beispiel Matt Neuburgs liest,iOS 7 Programming Fundamentals
zeigt er, dass eine Klasse, die ihren Delegierten als Eigentum deklariert, ihn "schwach" hält, das scheint fair zu sein.So rufen Sie die Teile der von Robert referenzierten Dokumente auf, die Ihre letzten beiden Fragen explizit beantworten:
Dies wird als schwache Nullreferenz bezeichnet. Mit __unsafe_unretained können Sie schwache Referenzen erstellen, die schwache Referenzen nicht auf Null setzen. Wie der Name schon sagt, wird dies im Allgemeinen nicht empfohlen.
Auch in den Dokumenten:
quelle
__unsafe_unretained
ist die ARC Version vonassign
.Die kristallklare Verwendung der WEAK-Eigenschaft ist wie folgt:
quelle
Nehmen wir ein Beispiel, um mehr zu erläutern (die obigen Antworten sind bereits großartig). Möge dieses Beispiel wenig mehr helfen
Lassen Sie uns zwei Klassen A und B haben
Der obige Code generiert einen Aufbewahrungszyklus, da beide vom starken Typ a --------> b ---------> a sind
Um dies zu vermeiden, müssen Sie die Week-Eigenschaft eines dieser Objekte verwenden, damit es wöchentlich auf das Objekt verweist und nicht die Referenzanzahl erhöht.
quelle