Was bedeutet die Eigenschaft "Nichtatomar"?

144

Was bedeutet "nichtatomar" in diesem Code?

@property(nonatomic, retain) UITextField *theUsersName;

Was ist der Unterschied zwischen atomar und nichtatomar?

Vielen Dank

swiftBoy
quelle
3
Entschuldigung,
Bitte lesen Sie auch diesen Link - stackoverflow.com/questions/588866/…
Vijayendra
Für jeden, der dies liest, ist es für 2014 wichtig zu erkennen, dass viele dieser Informationen äußerst veraltet sind. Mit einem Wort, es gibt keinen Grund, jemals nichtatomar zu verwenden, und es ist grundsätzlich falsch, es jemals zu verwenden, aus irgendeinem Grund. Es ist eine alte Geschichte. Nichtatomar bedeutet "Thread unsicherer Modus" und ist (mit einem Wort) jetzt völlig irrelevant. Einige Kommentare hier stackoverflow.com/q/23977765/294884
Fattie
Ich würde der "nicht relevanten" Aussage nicht zustimmen. Wenn sich der Wert selten ändert und als Beispiel in Apple doc Nachname ist. Es ändert sich einmal, dann ist die Verwendung eines atomaren Hinweises eine Verschwendung von Ressourcen, da die Überprüfungen nicht benötigt werden.
Nick Turner
Hier ist die Antwort stackoverflow.com/a/32942413/1961064
Grigori Jlavyan

Antworten:

268

Schauen Sie sich die Apple Docs an .

Wenn Sie sagen nonatomicund die Accessoren mithilfe von generieren, kann im Grunde genommen ein Fehler auftreten @synthesize, wenn mehrere Threads versuchen, die Eigenschaft gleichzeitig zu ändern / zu lesen. Sie können teilweise geschriebene Werte oder über freigegebene / beibehaltene Objekte erhalten, was leicht zu Abstürzen führen kann. (Dies ist jedoch möglicherweise viel schneller als ein atomarer Accessor.)

Wenn Sie die Standardeinstellung verwenden (dh es atomicgab früher kein Schlüsselwort dafür, aber jetzt ), verwenden die @synthesized-Methoden eine Sperre auf Objektebene, um sicherzustellen, dass mehrere Lese- / Schreibvorgänge in eine einzelne Eigenschaft serialisiert werden. Wie in den Apple-Dokumenten hervorgehoben, bedeutet dies nicht, dass das gesamte Objekt threadsicher ist , sondern dass die einzelnen Eigenschaften gelesen / geschrieben werden.

Wenn Sie Ihre eigenen Accessoren implementieren, anstatt sie zu verwenden @synthesize, tun diese Deklarationen meiner Meinung nach nichts anderes, als Ihre Absicht auszudrücken, ob die Eigenschaft threadsicher implementiert ist.

Jesse Rusak
quelle
7
Ich mag diese Antwort - weniger verwirrend, einfacher und vollständiger als anderswo!
Papillon
Wirklich großartig und weniger verwirrend (+1), aber können Sie bitte sagen, warum nicht-atomar potenziell viel schneller als ein atomarer Accessor?
Ich wünsche
2
@Wish Nicht-atomare Accessoren können schneller sein, da Sie, um zu verhindern, dass andere Threads gleichzeitig lesen / schreiben, einen Mutex halten oder andere Tricks auf niedriger Ebene ausführen müssen, die CPU-Zeit kosten. Wenn Sie eine Sperre verwenden, können Sie auch andere Threads blockieren, was ebenfalls einige Zeit in Anspruch nimmt.
Jesse Rusak
1
@Rob Vielleicht möchten Sie eine neue Frage dazu stellen.
Jesse Rusak
1
@Pratik Sorry, das stimmt nicht. Das Zitat, das Sie anzeigen, sagt genau das Gleiche wie ich: Das Erstellen einer Eigenschaft atomicvermeidet Abstürze beim Zugriff auf einzelne Eigenschaften, stellt jedoch nicht sicher, dass das gesamte Objekt (dh der Zugriff auf separate Eigenschaften wie Vor- und Nachname) funktioniert das Richtige.
Jesse Rusak
46

Nachdem ich so viele Artikel und StackOverflow-Beiträge gelesen und Demo-Apps zum Überprüfen der Eigenschaftenattribute von Variablen erstellt hatte, entschied ich mich, alle Attributinformationen zusammenzustellen

  1. atomar // Standard
  2. nichtatomar
  3. strong = beibehalten // Standard
  4. schwach = unsicher_unretained
  5. behalten
  6. // Standard zuweisen
  7. unsafe_unretained
  8. Kopieren
  9. schreibgeschützt
  10. readwrite // default

Unten finden Sie den detaillierten Artikel-Link, über den Sie alle oben genannten Attribute finden, die Ihnen auf jeden Fall helfen werden. Vielen Dank an alle, die hier die besten Antworten geben !!

Variable Eigenschaftsattribute oder Modifikatoren in iOS

  1. atomar
    • Atomic bedeutet, dass nur ein Thread auf die Variable zugreift (statischer Typ).
    • Atomic ist threadsicher.
    • Aber die Leistung ist langsam.
    • Atomic ist das Standardverhalten.
    • Atomic Accessors in einer Umgebung, in der kein Müll gesammelt wurde (dh bei Verwendung von Retain / Release / Autorelease), verwenden eine Sperre, um sicherzustellen, dass ein anderer Thread die korrekte Einstellung / das Abrufen des Werts nicht beeinträchtigt.
    • Es ist eigentlich kein Schlüsselwort.

Beispiel:

@property (retain) NSString *name;

@synthesize name;
  1. nichtatomar
    • Nichtatomar bedeutet, dass mehrere Threads auf die Variable zugreifen (dynamischer Typ).
    • Nichtatomar ist Thread unsicher.
    • Aber es ist schnell in der Leistung.
    • Nichtatomar ist KEIN Standardverhalten. Wir müssen ein nichtatomares Schlüsselwort in das Eigenschaftsattribut einfügen.
    • Dies kann zu unerwartetem Verhalten führen, wenn zwei verschiedene Prozesse (Threads) gleichzeitig auf dieselbe Variable zugreifen.

Beispiel:

@property (nonatomic, retain) NSString *name;

@synthesize name;
swiftBoy
quelle
12

Zusätzlich zu dem, was bereits über Thread-Sicherheit gesagt wurde, sind nicht-atomare Eigenschaften schneller als atomare Accessoren. Es ist nicht etwas, worüber Sie sich normalerweise Sorgen machen müssen, aber denken Sie daran. Von Core Data generierte Eigenschaften sind teilweise aus diesem Grund nichtatomar.

Marc Charbonneau
quelle
9

In einem Multithread-Programm kann eine atomare Operation nicht teilweise unterbrochen werden, wohingegen nichtatomare Operationen dies können.

Daher sollten Sie Mutexe (oder ähnliches) verwenden, wenn Sie eine kritische Operation haben, die nicht atomar ist und die Sie nicht unterbrechen möchten.

Joshdick
quelle
8

Wenn Sie "atomar" angeben, verfügen die generierten Zugriffsfunktionen über einen zusätzlichen Code, der vor gleichzeitigen Aktualisierungen schützt.

Paul Tomblin
quelle
6

Normalerweise bedeutet atomar, dass das Schreiben / Lesen in die Eigenschaft als einzelne Operation erfolgt. Atomic_operation

Jake
quelle
2

Sie können diese Dinge in den Griff bekommen, indem Sie den folgenden Artikel lesen.

Threading Erklärt mit dem Zweck des Nichtatoms

Nichtatomar - Nicht threadsicher

atomic - Thread Safe - Dies ist das Standardeigenschaftsattribut.

Easwaramoorthy K.
quelle
1
Bist du sicher, dass es nicht das Gegenteil ist? Atomare Eigenschaften sind sicher, aber nichtatomare Eigenschaften sind nicht sicher. Das letzte Mal, als ich nachgesehen habe, war es so: P
David Rönnqvist
0

Das "atomare" bedeutet, dass der Zugriff auf die Eigenschaft threadsicher ist, während das "nichtatomare" das Gegenteil davon ist. Wenn Sie eine Eigenschaft in Objective-C deklarieren, sind die Eigenschaften standardmäßig atomar, sodass synthetisierte Accessoren einen robusten Zugriff auf die Eigenschaft bieten In einer Multithread-Umgebung - das heißt, der vom Getter oder über den Setter zurückgegebene Wert wird immer vollständig abgerufen oder festgelegt, unabhängig davon, welche anderen Threads gleichzeitig ausgeführt werden. Wenn Sie jedoch die Eigenschaft wie unten als nichtatomar deklarieren

@property (nonatomic, retain)  NSString *myString;

dann bedeutet dies, dass ein synthetisierter Accessor für eine Objekteigenschaft den Wert einfach direkt zurückgibt. Die Wirkung des nichtatomaren Attributs hängt von der Umgebung ab. Standardmäßig sind synthetisierte Accessoren atomar. Nichtatomar ist also erheblich schneller als atomar.

AbcTest
quelle
-2

Einer ist für Multi-Threads. Eins ist nicht


quelle
IMHO: Um Upvotes zu erhalten, müssen Sie genauer sein und einige Zeit damit verbringen, Ihre Antwort zu schreiben.
Johan Karlsson