Sollen alle Eigenschaften als "nichtatomisch" deklariert werden?

8

Ich frage mich: sollten alle Eigenschaften in der iPhone-Entwicklung nonatomic sein? Wenn ja, warum?

    
n_yanev 24.05.2011, 19:28
quelle

4 Antworten

9

From Die Programmiersprache Objective-C , obligatorische Anleitung:

Atomarität

Sie können dieses Attribut verwenden, um anzugeben, dass die Zugriffsmethoden nicht atomar sind. (Es gibt kein Schlüsselwort, um Atom zu bezeichnen.)

nonatomic
Gibt an, dass Accessoren nichtatomisch sind. Accessoren sind standardmäßig atomar.

Eigenschaften sind standardmäßig atomar, sodass synthetisierte Zugriffsmodule einen robusten Zugriff auf Eigenschaften in einer Multithread-Umgebung bieten. Das heißt, dass der vom Getter zurückgegebene oder über den Setter festgelegte Wert immer vollständig abgerufen oder gesetzt wird, unabhängig davon, welche anderen Threads gleichzeitig ausgeführt werden . Weitere Informationen finden Sie unter " Leistung und Threading. "

Wenn Sie retain oder copy angeben und nonatomic nicht angeben, verwendet ein synthetisierter get-Zugriffsmechanismus für eine Objekteigenschaft in einer Umgebung mit Referenzzählung eine Sperre und behält und gibt den zurückgegebenen Wert - die Implementierung - automatisch zurück wird ähnlich wie folgt aussehen:

%Vor%

Wenn Sie nonatomic angeben, gibt ein synthetisierter Accessor für eine Objekteigenschaft einfach den Wert direkt zurück.

    
sidyll 24.05.2011, 19:37
quelle
5

Eigenschaften können entweder atomic oder nonatomic sein.

Wenn Sie eine Eigenschaft nonatomic deklarieren, ist das Schreiben viel schneller, aber nicht threadsicher.

Wenn Sie eine atomic -Eigenschaft deklarieren, ist das Schreiben Thread-sicher, aber es wird viel langsamer (da es es synchronisieren muss, so dass niemand es berührt)

    
arclight 24.05.2011 19:34
quelle
1

Standardmäßig sind Eigenschaften atomar, es sei denn, Sie verwenden andernfalls die Deklaration mit dem Schlüsselwort nonatomic. Dadurch wird sichergestellt, dass mehrere Threads nicht auf die Eigenschaft zugreifen, während Sie den Wert abrufen oder festlegen (obwohl die Thread-Sicherheit nicht gewährleistet ist). Mit diesem Verhalten ist eine Leistungseinbuße verbunden. Auf dem Desktop spielt das keine Rolle, aber auf dem iPhone ist es eine gute Idee, nichtatomare Daten zu verwenden, da die Prozessorleistung geringer ist, zumindest in Klassen, von denen Sie wissen, dass sie nur im Hauptthread verwendet werden.

>

Siehe auch diese Frage .

    
Marc Charbonneau 24.05.2011 19:38
quelle
1

Leistung Strafe ist nicht groß, aber das ist, wenn Sie Code schnell schreiben wollen "beschreibbare atomare Eigenschaft 'Name' kann nicht einen synthetisierten Setter mit einem benutzerdefinierten Getter paaren", so ist es besser, nicht atomare zu verwenden, weil später, wenn Sie Möchten Sie Getter überschreiben, liegt ein Problem mit dem synthetisierten Setter vor, das Sie normalerweise nicht überschreiben müssen.

    
Renetik 25.10.2012 10:25
quelle