In Objective-C wird zwischen atomaren und nichtatomaren Eigenschaften unterschieden:
@property (nonatomic, strong) NSObject *nonatomicObject;
@property (atomic, strong) NSObject *atomicObject;
Nach meinem Verständnis können Sie Eigenschaften, die als atomar definiert sind, sicher aus mehreren Threads lesen und schreiben, während das gleichzeitige Schreiben und Zugreifen auf nichtatomare Eigenschaften oder ivars aus mehreren Threads zu undefiniertem Verhalten führen kann, einschließlich fehlerhafter Zugriffsfehler.
Wenn Sie also eine Variable wie diese in Swift haben:
var object: NSObject
Kann ich diese Variable sicher parallel lesen und schreiben? (Ohne die tatsächliche Bedeutung zu berücksichtigen).
atomic
es im Allgemeinen nicht als ausreichend für eine thread-sichere Interaktion mit einer Eigenschaft angesehen, außer für einfache Datentypen. Bei Objekten wird der Zugriff über Threads im Allgemeinen mithilfe von Sperren (z. B. NSLock
oder @synchronized
) oder GCD-Warteschlangen (z. B. serielle Warteschlange oder gleichzeitige Warteschlange mit dem Muster "Leser-Schreiber") synchronisiert .
atomic
die Fadensicherheit für Objekte nicht gewährleistet; und (b) wenn man eine der oben genannten Synchronisationstechniken richtig verwendet, um die Thread-Sicherheit zu gewährleisten (unter anderem um gleichzeitiges Lesen / Schreiben zu verhindern), ist das atomare Problem umstritten. Aber wir brauchen / wollen es immer noch für einfache Datentypen, bei denen es atomic
einen echten Wert hat. Gute Frage!
@atomic
oder verwenden@nonatomic
. oder standardmäßig nur atomar. (Swift ist so unvollständig, wir können jetzt nicht viel sagen)