Was bedeutet "nichtatomar" in diesem Code?
@property(nonatomic, retain) UITextField *theUsersName;
Was ist der Unterschied zwischen atomar und nichtatomar?
Vielen Dank
Was bedeutet "nichtatomar" in diesem Code?
@property(nonatomic, retain) UITextField *theUsersName;
Was ist der Unterschied zwischen atomar und nichtatomar?
Vielen Dank
Antworten:
Schauen Sie sich die Apple Docs an .
Wenn Sie sagen nonatomic
und 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 atomic
gab früher kein Schlüsselwort dafür, aber jetzt ), verwenden die @synthesize
d-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.
atomic
vermeidet 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.
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
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 !!
Beispiel:
@property (retain) NSString *name;
@synthesize name;
Beispiel:
@property (nonatomic, retain) NSString *name;
@synthesize name;
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.
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.
Wenn Sie "atomar" angeben, verfügen die generierten Zugriffsfunktionen über einen zusätzlichen Code, der vor gleichzeitigen Aktualisierungen schützt.
Normalerweise bedeutet atomar, dass das Schreiben / Lesen in die Eigenschaft als einzelne Operation erfolgt. Atomic_operation
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.
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.
Einer ist für Multi-Threads. Eins ist nicht