2012-03-25 10 views
277

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)

+0

ist beantworten http://stackoverflow.com/a/32942413/1961064 –

+0

http://rypress.com/tutorials/objective-c/properties das erklärt alles –

Antwort

547

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.

+0

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 ... –

+1

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). –

+1

Sie vermissen die Assign-Eigenschaft. – mskw

17

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.

+0

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

44

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 ...

+0

Warum stark, schwach, behalten, kopieren, sich gegenseitig ausschließen –

+0

'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

+0

@bbum Kannst du den Unterschied zwischen keinem Ausschluss und nicht threadsicher erklären? –

9

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

Verwandte Themen