Objective-C deklarierte @ property-Attribute (nichtatomar, kopiert, stark, schwach)


289

Kann mir jemand im Detail erklären , wenn ich jedes Attribut verwenden müssen: nonatomic, copy, strong, weak, und so weiter, für eine deklarierte Eigenschaft, und erklären , was jeder tut? Ein Beispiel wäre auch großartig. Ich benutze ARC.



Antworten:


559

Diese Antwort weist zahlreiche Fehler auf und ist ebenfalls veraltet. Bitte beachten Sie andere Fragen / Antworten und die Kommentare.


Nichtatomar

nonatomicwird für Multithreading-Zwecke verwendet. Wenn wir das nichtatomare Attribut zum Zeitpunkt der Deklaration festgelegt haben, kann jeder andere Thread, der Zugriff auf dieses Objekt wünscht, darauf zugreifen und Ergebnisse in Bezug auf Multithreading liefern.

Kopieren

copyist erforderlich, wenn das Objekt veränderbar ist. Verwenden Sie diese Option, wenn Sie den aktuellen Wert des Objekts benötigen und nicht möchten, dass dieser Wert Änderungen widerspiegelt, die von anderen Eigentümern des Objekts vorgenommen wurden. Sie müssen das Objekt freigeben, wenn Sie damit fertig sind, da Sie die Kopie behalten.

Zuordnen

Assignist etwas das Gegenteil von copy. Beim Aufrufen des Getters einer assignEigenschaft wird ein Verweis auf die tatsächlichen Daten zurückgegeben. Normalerweise verwenden Sie dieses Attribut, wenn Sie eine Eigenschaft vom primitiven Typ haben (float, int, BOOL ...).

Behalten

retainist erforderlich, wenn das Attribut ein Zeiger auf ein Objekt ist. Der von erzeugte Setter @synthesizebehält das Objekt bei (auch bekannt als Hinzufügen einer Anzahl). Sie müssen das Objekt freigeben, wenn Sie damit fertig sind. Durch die Verwendung von Retain wird die Anzahl der Retains erhöht und der Speicher im Autorelease-Pool belegt.

Stark

strongist ein Ersatz für das Attribut keep im Rahmen von Objective-C Automated Reference Counting (ARC). In Nicht-ARC-Code ist es nur ein Synonym für Beibehalten.

Dies ist eine gute Website zu lernen strongund weakfür iOS 5. http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

Schwach

weakähnelt, mit der strongAusnahme, dass die Referenzanzahl nicht um 1 erhöht wird. Es wird kein Eigentümer dieses Objekts, sondern enthält nur eine Referenz darauf. Wenn die Referenzanzahl des Objekts auf 0 fällt, obwohl Sie hier möglicherweise immer noch darauf zeigen, wird die Zuordnung aus dem Speicher aufgehoben.

Der obige Link enthält sowohl gute Informationen zu Schwach als auch Stark.


1
Wenn Sie diesen NSString nur intern in dieser Klasse selbst verwenden, als Sie nicht einmal eine Eigenschaft benötigen, können Sie ihn einfach zu einem iVar machen. Wenn Sie ihn in einer anderen Klasse verwenden, als ich empfehlen werde (stark, kopieren).
Ankit Srivastava

1
Ihnen fehlt die Eigenschaft Zuweisen.
mskw

10
nonatomicbedeutet, dass nicht mehrere Threads gleichzeitig darauf zugreifen sollten. Die Standardeinstellung ist atomic, dass der Thread sicher ist.
wcochran

1
Es ist ein wenig beunruhigend, dass nach all dieser Zeit die Definition von nichtatomar immer noch falsch ist und atomar ähnelt. Ich frage mich, wie viele Leute dies in den letzten fünf Jahren benutzt haben und den falschen Eindruck bekommen haben. Was @wcochran sagte, war richtig. Nichtatomar bedeutet, dass der Zugriff auf den Zeiger nicht atomar erfolgt und daher nicht threadsicher ist. Der Vorteil von nichtatomarem, wie ich es verstehe, ist, dass es leichter ist.
John Bushnell

1
Neben dem Kommentar von @JohnBushnell gibt es viele andere Fehler und Ungenauigkeiten in dieser Antwort. Es ist auch nicht gut gealtert, so ist etwas historisch. Suchen Sie woanders nach einer Antwort auf diese Frage.
CRD

45

nonatomic Die Eigenschaft gibt an, dass das Objekt nicht threadsicher ist. Wenn also ein anderer Thread versucht, auf dieses Objekt zuzugreifen, können schlimme Dinge passieren, dies ist jedoch viel schneller als die atomare Eigenschaft.

strongwird 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 verwenden, strongbedeutet dies, dass Sie das Objekt besitzen.

weakEigentum bedeutet, dass Sie es nicht besitzen und es verfolgt nur das Objekt, bis das Objekt, dem es zugewiesen wurde, erhalten bleibt. Sobald das zweite Objekt freigegeben wird, verliert es seinen Wert. Zum Beispiel. obj.a=objectB;wird verwendet und a hat eine schwache Eigenschaft, dann ist sein Wert nur gültig, bis Objekt B im Speicher bleibt.

copyEigentum ist hier sehr gut erklärt

strong,weak,retain,copy,assignschließen sich gegenseitig aus, sodass Sie sie nicht für ein einzelnes Objekt verwenden können. Lesen Sie den Abschnitt "Deklarierte Eigenschaften"

Ich hoffe, das hilft dir ein bisschen ...


warum stark, schwach, behalten, kopieren, sich gegenseitig ausschließen
vinoth.kumar

nonatomicbedeutet nur, dass kein Ausschluss angewendet wird. Dies bedeutet nicht, dass der Zugriff nicht threadsicher ist. Dies ist ein Implementierungsdetail, das atomicvs. nonatomicnicht erfasst.
bbum

@bbum Kannst du den Unterschied zwischen ohne Ausschluss und nicht threadsicher erklären?
Ankit Srivastava

1
@AnkitSrivastava- Ausschluss ist, wenn Thread A Thread B daran hindert, einen Codepfad zu durchlaufen . Wenn dieser Codepfad für die Ausführung aus mehreren Threads sicher ist, ist ein Ausschluss nicht erforderlich. Nicht threadsicher bedeutet, dass der Codepfad undefinierte Ergebnisse liefern kann, wenn A und B ihn gleichzeitig herunterfahren. Das heißt, Ausschluss kann verwendet werden, um etwas Thread-sicher zu machen, aber Thread-Sicherheit erfordert keine exklusive - nicht gleichzeitige - Ausführung.
bbum

17

Dieser Link hat die Aufschlüsselung

http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property

Zuweisen impliziert __unsafe_unretained Eigentum.

Kopieren impliziert ein starkes Eigentum sowie das übliche Verhalten der Kopiersemantik auf dem Setter.

behalten bedeutet __ starkes Eigentum.

stark impliziert __ starkes Eigentum.

unsafe_unretained impliziert __unsafe_unretained Ownership.

schwach impliziert __schwache Eigentümerschaft.


Wird die Assign-Eigenschaft nicht nur für iVar und Werte verwendet? Warum ist es unsicher und warum muss angemerkt werden, dass es nicht zurückgehalten wird?
mskw

9

Tolle Antworten! Eine Sache, die ich tiefer klären möchte, ist nonatomic/ atomic. Der Benutzer sollte verstehen, dass sich diese Eigenschaft - "Atomizität" - nur auf die Referenz des Attributs und nicht auf dessen Inhalt ausbreitet. Dh atomicgarantiert dem Benutzer Atomizität für das Lesen / Setzen des Zeigers und nur des Zeigers auf das Attribut. Zum Beispiel:

@interface MyClass: NSObject
@property (atomic, strong) NSDictionary *dict;
...

In diesem Fall ist garantiert, dass der Zeiger auf das dictvon verschiedenen Threads atomar gelesen / gesetzt wird. ABER das dictselbst (das Wörterbuch dict, auf das verwiesen wird) ist immer noch threadsicher , dh alle Lese- / Hinzufügungsvorgänge zum Wörterbuch sind immer noch threadsicher.

Wenn Sie eine thread-sichere Sammlung benötigen, haben Sie entweder eine schlechte Architektur (häufiger) oder eine echte Anforderung (seltener). Wenn es sich um eine "echte Anforderung" handelt, sollten Sie entweder eine gute und getestete fadensichere Sammlungskomponente finden oder auf Prüfungen und Schwierigkeiten vorbereitet sein, wenn Sie Ihre eigene schreiben. Im letzteren Fall werden "sperrfreie", "wartungsfreie" Paradigmen betrachtet. Sieht auf den ersten Blick wie Raketenwissenschaft aus, könnte Ihnen aber dabei helfen, eine fantastische Leistung im Vergleich zum "üblichen Sperren" zu erzielen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.