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.
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:
Diese Antwort weist zahlreiche Fehler auf und ist ebenfalls veraltet. Bitte beachten Sie andere Fragen / Antworten und die Kommentare.
Nichtatomar
nonatomic
wird 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
copy
ist 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
Assign
ist etwas das Gegenteil von copy
. Beim Aufrufen des Getters einer assign
Eigenschaft 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
retain
ist erforderlich, wenn das Attribut ein Zeiger auf ein Objekt ist. Der von erzeugte Setter @synthesize
behä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
strong
ist 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 strong
und weak
für iOS 5.
http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1
Schwach
weak
ähnelt, mit der strong
Ausnahme, 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.
nonatomic
bedeutet, dass nicht mehrere Threads gleichzeitig darauf zugreifen sollten. Die Standardeinstellung ist atomic
, dass der Thread sicher ist.
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.
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 verwenden, strong
bedeutet dies, dass Sie das Objekt besitzen.
weak
Eigentum 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.
copy
Eigentum ist hier sehr gut erklärt
strong,weak,retain,copy,assign
schließ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 ...
nonatomic
bedeutet nur, dass kein Ausschluss angewendet wird. Dies bedeutet nicht, dass der Zugriff nicht threadsicher ist. Dies ist ein Implementierungsdetail, das atomic
vs. nonatomic
nicht erfasst.
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.
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 atomic
garantiert 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 dict
von verschiedenen Threads atomar gelesen / gesetzt wird. ABER das dict
selbst (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.