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? Eine Art von Beispiel wäre auch großartig. Ich benutze ARC.Objective-C erklärt @property Attribute (nonatomic, kopieren, stark, schwach)
Antwort
Diese Antwort hat zahlreiche Fehler und ist auch veraltet. Bitte sehen Sie andere Fragen/Antworten und die Kommentare.
nichtatomare
nonatomic
ist für Multi-Threading Zwecke verwendet. Wenn wir das nichtatomare Attribut zum Zeitpunkt der Deklaration festgelegt haben, kann jeder andere Thread, der auf dieses Objekt zugreifen möchte, darauf zugreifen und Ergebnisse in Bezug auf Multithreading liefern.
Copy
copy
erforderlich, wenn das Objekt wandelbar ist. Verwenden Sie diese Option, wenn Sie den Wert des Objekts in diesem Moment benötigen, und Sie möchten nicht, dass der Wert die Änderungen widerspiegelt, die von anderen Eigentümern des Objekts vorgenommen wurden. Sie müssen das Objekt freigeben, wenn Sie damit fertig sind, weil Sie die Kopie behalten.
Assign
Assign
ist etwas gegenüber der copy
. Wenn der Getter einer assign
Eigenschaft aufgerufen wird, gibt es einen Verweis auf die tatsächlichen Daten zurück. Normalerweise verwenden Sie dieses Attribut, wenn Sie eine Eigenschaft Urtyp haben (float, int, BOOL ...)
beibehalten
retain
ist erforderlich, wenn das Attribut ein Zeiger auf ein Objekt ist. Der von @synthesize
generierte Setter wird das Objekt beibehalten (auch eine Retain-Zählung hinzufügen). Sie müssen das Objekt freigeben, wenn Sie damit fertig sind. Durch die Verwendung von "retain" erhöht sich die Retain-Anzahl und belegt den Speicher im Autorelease-Pool.
Strong
strong
ist ein Ersatz für das Attribut beibehalten, als Teil der Objective-C Automatische Referenzzählung (ARC). In Nicht-ARC-Code ist es nur ein Synonym für behalten.
Dies ist eine gute Quelle zu strong
und weak
für iOS zu lernen 5. http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1
Weak
weak
ist ähnlich strong
außer dass sie den Referenzzähler um 1 nicht erhöht. Es wird kein Eigentümer dieses Objekts, sondern enthält lediglich einen Verweis darauf. Wenn der Referenzzähler des Objekts auf 0 fällt, obwohl Sie möglicherweise noch darauf zeigen, wird die Zuweisung aus dem Speicher aufgehoben.
Der obige Link enthält sowohl gute Informationen bezüglich Schwach und stark.
Danke für die Erklärung, ich habe aber einige Fragen, 1. Ich habe meine Hauptdatenklasse, in dieser Klasse habe ich alle Attribute zu stark eingestellt. Wenn ich dann eine andere Klasse erstelle, habe ich einen Variablenwert von NSString, der Wert von einem Textfeld erhält, sollte dieser NSString-Wert vom schwachen Typ sein? Entschuldigung für noob Fragen immer noch lernen ... –
Wenn Sie diese NSString nur intern in dieser Klasse selbst verwenden, als Sie nicht einmal eine Eigenschaft benötigen, können Sie es nur ein iVar machen und wenn Sie es in einer anderen Klasse als ich verwenden beraten (stark, kopieren). –
Sie vermissen die Assign-Eigenschaft. – mskw
Dieser Link hat den Abbau
http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property
assign impliziert __unsafe_unretained Eigentum.
Kopie impliziert __starken Besitz, sowie das übliche Verhalten der Kopie Semantik auf dem Setter.
behalten bedeutet __starken Besitz.
stark impliziert __starken Besitz.
unsafe_unrealted bedeutet __unsafe_unre tained eigentum.
schwach bedeutet __weak Besitz.
ist nicht die Assign Eigenschaft nur für iVar verwendet und Werte? Warum also ist es unsicher und warum muss man beachten, dass es nicht zurückgehalten wird? – mskw
nonatomic
Eigenschaft besagt, dass das Objekt nicht sicher ist, fädelt, was bedeutet, wenn ein anderer Thread auf dieses Objekt zugreifen versucht als schlechte Dinge passieren können, aber das ist viel schneller als Atom-Eigenschaft.
strong
wird mit ARC verwendet und es hilft Ihnen im Grunde, indem Sie sich nicht um die Anzahl der Retouren eines Objekts 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 das, 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, bleibt, sobald das zweite Objekt freigegeben wird verliert es Wert. Für z. obj.a=objectB;
wird verwendet und hat eine schwache Eigenschaft, deren Wert nur gültig ist, bis ObjektB im Speicher verbleibt.
copy
Eigenschaft ist sehr gut explained here
strong,weak,retain,copy,assign
sich gegenseitig aus, so dass Sie sie nicht auf ein einzelnes Objekt verwenden können ... Lesen Sie den "Declared Properties " Abschnitt
der Hoffnung, dies hilft Ihnen ein bisschen aus ...
Warum stark, schwach, behalten, kopieren, sich gegenseitig ausschließen –
'nichtatomisch' bedeutet nur, dass kein Ausschluss angewendet wird. Es bedeutet nicht, dass der Zugriff nicht Thread-sicher ist. Das ist ein Implementierungsdetail, das "atomare" gegenüber "nichtatomare" nicht erfasst. – bbum
@bbum Kannst du den Unterschied zwischen keinem Ausschluss und nicht threadsicher erklären? –
Große Antworten! Eine Sache, die ich tiefer klären möchte, ist nonatomic
/atomic
. Der Benutzer sollte verstehen, dass diese Eigenschaft - "Atomizität" nur auf die Referenz des Attributs und nicht auf seinen Inhalt verbreitet. I.e. atomic
garantiert die Atomizität des Benutzers zum Lesen/Setzen des Zeigers und nur den Zeiger auf das Attribut. Zum Beispiel:
@interface MyClass: NSObject
@property (atomic, strong) NSDictionary *dict;
...
In diesem Fall ist es, dass der Zeiger auf die dict
garantiert wird von verschiedenen Threads in atomarer Weise gelesen/eingestellt werden. aber die dict
selbst (das Wörterbuch dict
zeigt auf) ist immer noch Thread unsicher, d.h. alle Lese-/Add-Operationen zum Wörterbuch sind immer Thread unsicher.
Wenn Sie Thread-sichere Sammlung benötigen, haben Sie entweder schlechte Architektur (häufiger) oder echte Anforderung (seltener). Wenn es "echte Anforderung" ist - sollten Sie entweder gute & getestete thread safe Sammlung Komponente finden ODER für Versuche vorbereitet sein, Ihre eigene zu schreiben. Letztere Fall betrachten "lock-free", "wartefrei" Paradigmen. Sieht auf den ersten Blick nach Raketenwissenschaft aus, könnte Ihnen aber helfen, eine phantastische Leistung im Vergleich zum "normalen Locking" zu erzielen. Hier
ist beantworten http://stackoverflow.com/a/32942413/1961064 –
http://rypress.com/tutorials/objective-c/properties das erklärt alles –