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.
objective-c
automatic-ref-counting
declared-property
Gaurav_soni
quelle
quelle
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 voncopy
. Beim Aufrufen des Getters einerassign
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
undweak
für iOS 5. http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1Schwach
weak
ähnelt, mit derstrong
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.
quelle
nonatomic
bedeutet, dass nicht mehrere Threads gleichzeitig darauf zugreifen sollten. Die Standardeinstellung istatomic
, 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ärtstrong,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 ...
quelle
nonatomic
bedeutet nur, dass kein Ausschluss angewendet wird. Dies bedeutet nicht, dass der Zugriff nicht threadsicher ist. Dies ist ein Implementierungsdetail, dasatomic
vs.nonatomic
nicht erfasst.Dieser Link hat die Aufschlüsselung
http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property
quelle
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. Dhatomic
garantiert dem Benutzer Atomizität für das Lesen / Setzen des Zeigers und nur des Zeigers auf das Attribut. Zum Beispiel:In diesem Fall ist garantiert, dass der Zeiger auf das
dict
von verschiedenen Threads atomar gelesen / gesetzt wird. ABER dasdict
selbst (das Wörterbuchdict
, 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.
quelle