1951 Stimmen

Was ist der Unterschied zwischen den atomaren und nichtatomaren Attributen?

Was tun atomic y nonatomic in Eigenschaftserklärungen bedeuten?

@property(nonatomic, retain) UITextField *userName;
@property(atomic, retain) UITextField *userName;
@property(retain) UITextField *userName;

Was ist der operative Unterschied zwischen diesen drei?

31voto

IOS Rocks Punkte 2107

Atomar bedeutet, dass nur ein Thread auf die Variable zugreift (statischer Typ). Atomic ist thread-sicher, aber langsam.

Nichtatomar bedeutet, dass mehrere Threads auf die Variable zugreifen (dynamischer Typ). Nonatomic ist thread-unsicher, aber schnell.

15voto

Atomic ist fadensicher ist es langsam und es gut versichert (nicht garantiert) dass nur der gesperrte Wert bereitgestellt wird, unabhängig davon, wie viele Threads versuchen, über dieselbe Zone zuzugreifen. Bei der Verwendung von atomic wird ein Stück Code, das innerhalb dieser Funktion geschrieben wird, zum Teil des kritischen Abschnitts, den nur ein Thread gleichzeitig ausführen kann.

Sie gewährleistet nur die Sicherheit des Fadens, aber keine Garantie dafür. Was ich meine, ist, Sie mieten ein Experte Fahrer für Sie Auto, noch ist es nicht garantiert Auto wird nicht zu einem Unfall. Allerdings bleibt die Wahrscheinlichkeit am geringsten.

Atomar - es kann nicht abgebaut werden, also wird das Ergebnis erwartet. Mit nonatomic - wenn ein anderer Thread auf die Speicherzone zugreift, kann er sie verändern, so dass das Ergebnis unerwartet ist.

Code Talk :

Atomic machen Getter und Setter der Eigenschaft Thread sicher. zum Beispiel, wenn u geschrieben haben:

self.myProperty = value;

ist thread-sicher.

[myArray addObject:@"Abc"] 

ist NICHT thread-sicher.

0 Stimmen

Ich weiß nicht, wie der letzte Absatz zustande kommt, aber er ist schlichtweg falsch, so etwas wie eine "Privatkopie" gibt es nicht.

13voto

Proton Punkte 1327

atomar (Standard)

Atomic ist die Standardeinstellung: Wenn Sie nichts eingeben, ist Ihre Eigenschaft atomar. Eine atomare Eigenschaft garantiert, dass Sie beim Versuch, aus ihr zu lesen einen gültigen Wert zurückerhält. Sie gibt keine Garantien was dieser Wert sein könnte, aber Sie erhalten gute Daten zurück, nicht nur Speicherschrott. Dies ermöglicht es Ihnen, wenn Sie mehrere Threads oder mehrere Prozesse auf eine einzelne Variable verweisen, kann ein kann ein Thread lesen und ein anderer Thread schreiben. Wenn sie zur gleichen Zeit zur gleichen Zeit, erhält der lesende Thread garantiert einen der beiden Werte: entweder vor der Änderung oder nach der Änderung. Was atomic nicht bietet keine Garantie dafür, welchen dieser Werte man erhalten wird. erhalten könnte. Atomic wird sehr häufig mit Thread-Safe verwechselt, und das ist nicht korrekt. Sie müssen Ihre Thread-Sicherheit auf andere Weise garantieren. Atomic garantiert jedoch, dass man beim Versuch zu lesen, eine Art von Wert zurückbekommt.

nichtatomar

Auf der anderen Seite bedeutet "nicht-atomar", wie Sie wahrscheinlich erraten können, einfach nur, "mach nicht dieses atomare Zeug". Was Sie verlieren, ist die Garantie, dass Sie immer etwas zurückbekommt. Wenn Sie versuchen, mitten in einem Schreibvorgang zu lesen Schreibvorgangs zu lesen, könnte man Datenmüll zurückbekommen. Aber auf der anderen Seite ist man ein wenig schneller. Denn atomare Eigenschaften müssen etwas zaubern um zu garantieren, dass man einen Wert zurückbekommt, sind sie ein bisschen langsamer. Wenn eine Eigenschaft ist, auf die Sie häufig zugreifen, sollten Sie auf auf nichtatomare Eigenschaften zurückgreifen, um sicherzustellen, dass die Geschwindigkeit nicht beeinträchtigt wird. Nachteil.

Sehen Sie hier mehr: https://realm.io/news/tmi-objective-c-property-attributes/

12voto

Deepak Punkte 439

Es gibt kein solches Schlüsselwort "atomar".

@property(atomic, retain) UITextField *userName;

Wir können die obigen Angaben wie folgt verwenden

@property(retain) UITextField *userName;

Siehe Stack Overflow Frage Ich bekomme Probleme, wenn ich @property(atomic,retain)NSString *myString verwende .

11 Stimmen

"Dass das Schlüsselwort nicht standardmäßig erforderlich ist und sogar der Standardwert ist, bedeutet nicht, dass es das Schlüsselwort nicht gibt.

5 Stimmen

Dies ist falsch. Das Schlüsselwort gibt es tatsächlich. Diese Antwort ist irreführend, und ich würde empfehlen, sie zu löschen.

11voto

Binarian Punkte 12002

El Standard es atomic Das bedeutet, dass Sie bei jeder Verwendung der Eigenschaft Leistung verlieren, aber es ist thread-sicher. In Objective-C wird eine Sperre gesetzt, sodass nur der aktuelle Thread auf die Variable zugreifen kann, solange der Setter/Getter ausgeführt wird.

Beispiel mit MRC für eine Eigenschaft mit einem Ivar _internal:

[_internal lock]; //lock
id result = [[value retain] autorelease];
[_internal unlock];
return result;

Die letzten beiden sind also identisch:

@property(atomic, retain) UITextField *userName;

@property(retain) UITextField *userName; // defaults to atomic

Andererseits gilt nonatomic nichts zu Ihrem Code hinzufügen. Es ist also nur dann thread-sicher, wenn Sie den Sicherheitsmechanismus selbst codieren.

@property(nonatomic, retain) UITextField *userName;

Die Schlüsselwörter müssen nicht unbedingt als erstes Eigenschaftsattribut angegeben werden.

Vergessen Sie nicht, dass dies nicht bedeutet, dass die Eigenschaft als Ganzes thread-sicher ist. Nur der Methodenaufruf des Setters/Getters ist sicher. Aber wenn Sie einen Setter und danach einen Getter zur gleichen Zeit mit 2 verschiedenen Threads verwenden, könnte auch das kaputt sein!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X