web-dev-qa-db-de.com

@property behalten, zuweisen, kopieren, nicht atomar in Objective-C

Kann mir jemand, der neu in Objective-C ist, einen Überblick über das Speichern, Zuweisen, Kopieren und alle anderen fehlenden Elemente geben, die der @ property-Direktive entsprechen? Was machen sie und warum möchte ich sie übereinander verwenden?

206
Mark Reid

Der von MrMage verlinkte Artikel funktioniert nicht mehr. Also, hier ist, was ich in meiner (sehr) kurzen Zeitkodierung in Objective-C gelernt habe:

nichtatomar vs. atomar - "atomar" ist die Standardeinstellung. Verwenden Sie immer "nichtatomar". Ich weiß nicht warum, aber das Buch, das ich las, sagte, es gebe "selten einen Grund", "atomar" zu verwenden. (Übrigens: Das Buch, das ich gelesen habe, ist das BNR-Buch "iOS Programming".)

readwrite vs. readonly - "readwrite" ist die Standardeinstellung. Wenn Sie @synthesize, werden sowohl ein Getter als auch ein Setter für Sie erstellt. Wenn Sie "readonly" verwenden, wird kein Setter erstellt. Verwenden Sie ihn für einen Wert, den Sie nach der Instanziierung des Objekts nicht mehr ändern möchten.

behalten vs. kopieren vs. zuweisen

  • "zuweisen" ist die Standardeinstellung. In dem von @synthesize erstellten Setter wird der Wert einfach dem Attribut zugewiesen. Mein Verständnis ist, dass "zuweisen" für Nicht-Zeiger-Attribute verwendet werden sollte.
  • "behalten" wird benötigt, wenn das Attribut ein Zeiger auf ein Objekt ist. Der von @synthesize generierte Setter behält das Objekt bei (oder addiert eine Retain-Anzahl). Sie müssen das Objekt freigeben, wenn Sie damit fertig sind.
  • "copy" wird benötigt, wenn das Objekt veränderbar ist. Verwenden Sie diese Option, wenn Sie den aktuellen Wert des Objekts benötigen und nicht möchten, dass dieser Wert Änderungen widerspiegelt, die von anderen Eigentümern des Objekts vorgenommen wurden. Sie müssen das Objekt freigeben, wenn Sie damit fertig sind, da Sie die Kopie behalten.
267
Blamdarot

Bevor Sie die Attribute von @property kennen, sollten Sie wissen, wie @property verwendet wird.

  • @ property bietet eine Möglichkeit, die Informationen zu definieren, die eine Klasse kapseln soll. Wenn Sie ein Objekt/eine Variable mit @ property deklarieren, können andere Klassen auf dieses Objekt/diese Variable zugreifen, die ihre Klasse importieren.

  • Wenn Sie ein Objekt mit @ property in der Header-Datei deklarieren, müssen Sie es mit @ synthesize in der Implementierungsdatei synthetisieren. Dies macht das Objekt KVC-kompatibel. Standardmäßig synthetisiert der Compiler Zugriffsmethoden für dieses Objekt.

  • accessor-Methoden sind: Setter und Getter.

Beispiel: .h

@interface XYZClass : NSObject
@property (nonatomic, retain) NSString *name;
@end

.m

@implementation XYZClass
@synthesize name;
@end

Der Compiler synthetisiert nun die Zugriffsmethoden für Name.

XYZClass *obj=[[XYZClass alloc]init];
NSString *name1=[obj name]; // get 'name'
[obj setName:@"liza"]; // first letter of 'name' becomes capital in setter method
  • Liste der Attribute von @ property

    atomar, nichtatomar, beibehalten, kopieren, schreibgeschützt, schreibgeschützt, zuweisen, stark, getter = Methode, setter = Methode, unsafe_unretained

  • atomar ist das Standardverhalten. Wenn ein Objekt als atomar deklariert wird, ist es threadsicher. Thread-sicher bedeutet, dass zu einem Zeitpunkt nur ein Thread einer bestimmten Instanz dieser Klasse die Kontrolle über dieses Objekt haben kann.

Wenn der Thread eine Get-Methode ausführt, kann kein anderer Thread eine Setter-Methode für dieses Objekt ausführen. Es ist langsam.

@property NSString *name; //by default atomic`
@property (atomic)NSString *name; // explicitly declared atomic`
  • nichtatomar ist nicht threadsicher. Mit dem Attribut "nonatomic property" können Sie festlegen, dass synthetisierte Accessoren einen Wert einfach festlegen oder direkt zurückgeben. Dabei kann nicht garantiert werden, was passiert, wenn auf denselben Wert gleichzeitig von verschiedenen Threads aus zugegriffen wird.

Aus diesem Grund ist der Zugriff auf eine nichtatomare Eigenschaft schneller als auf eine atomare.

@property (nonatomic)NSString *name;   
  • behalten ist erforderlich, wenn das Attribut ein Zeiger auf ein Objekt ist.

Die Setter-Methode erhöht die Anzahl der Beibehaltungen des Objekts, sodass der Speicher im Autorelease-Pool belegt wird.

@property (retain)NSString *name;
  • copy Wenn Sie copy verwenden, können Sie retain nicht verwenden. Bei Verwendung der Instanz copy der Klasse wird eine eigene Kopie erstellt.

Auch wenn eine veränderbare Zeichenfolge festgelegt und anschließend geändert wird, erfasst die Instanz den Wert, den sie zum Zeitpunkt der Festlegung hat. Es werden keine Setter- und Getter-Methoden synthetisiert.

@property (copy) NSString *name;

jetzt,

NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];    
xyzObj.name = nameString;    
[nameString appendString:@"Pizza"]; 

name bleibt unberührt.

  • schreibgeschützt Wenn Sie nicht möchten, dass die Eigenschaft über die Setter-Methode geändert wird, können Sie die Eigenschaft schreibgeschützt deklarieren.

Der Compiler generiert einen Getter, aber keinen Setter.

@property (readonly) NSString *name;
  • readwrite ist das Standardverhalten. Sie müssen das Attribut readwrite nicht explizit angeben.

Es ist das Gegenteil von readonly.

@property (readwrite) NSString *name;
  • assign generiert einen Setter, der der Instanzvariablen den Wert direkt zuweist, anstatt ihn zu kopieren oder beizubehalten. Dies ist am besten für primitive Typen wie NSInteger und CGFloat oder Objekte geeignet, die Sie nicht direkt besitzen, wie z. B. Delegaten.

Beachten Sie, dass Beibehalten und Zuweisen grundsätzlich austauschbar sind, wenn die Speicherbereinigung aktiviert ist.

@property (assign) NSInteger year;
  • stark ist ein Ersatz für behalten.

Es kommt mit ARC.

@property (nonatomic, strong) AVPlayer *player; 
  • getter = method Wenn Sie einen anderen Namen für eine Getter-Methode verwenden möchten, können Sie einen benutzerdefinierten Namen angeben, indem Sie der Eigenschaft Attribute hinzufügen.

Bei Booleschen Eigenschaften (Eigenschaften mit einem YES- oder NO-Wert) beginnt die Getter-Methode normalerweise mit dem Wort "is".

@property (getter=isFinished) BOOL finished;
  • setter = method Wenn Sie einen anderen Namen für eine Setter-Methode verwenden möchten, können Sie einen benutzerdefinierten Namen angeben, indem Sie der Eigenschaft Attribute hinzufügen.

Die Methode sollte mit einem Doppelpunkt enden.

@property(setter = boolBool:) BOOL finished;
  • nsafe_unretained In Cocoa und Cocoa Touch gibt es einige Klassen, die noch keine schwachen Referenzen unterstützen. Sie können also keine schwachen Eigenschaften oder lokale Variablen deklarieren, um den Überblick zu behalten. Diese Klassen umfassen NSTextView, NSFont und NSColorSpace usw. Wenn Sie einen schwachen Verweis auf eine dieser Klassen verwenden müssen, müssen Sie einen unsicheren Verweis verwenden.

Eine unsichere Referenz ähnelt einer schwachen Referenz, da sie das zugehörige Objekt nicht am Leben erhält, jedoch nicht auf nil gesetzt wird, wenn die Zuordnung des Zielobjekts aufgehoben wird.

@property (unsafe_unretained) NSObject *unsafeProperty;

Wenn Sie mehrere Attribute angeben müssen, fügen Sie diese einfach als durch Kommas getrennte Liste ein:

@property (readonly, getter=isFinished) BOOL finished;
288
liza

Nachdem ich viele Artikel gelesen hatte, entschloss ich mich, alle Attributinformationen zusammenzufassen:

  1. atomic // default
  2. nichtatomar
  3. stark = // Standard beibehalten
  4. schwach = unsicher
  5. behalten
  6. // default zuweisen
  7. unsafe_unretained
  8. kopieren
  9. schreibgeschützt
  10. readwrite // default

Unten finden Sie einen Link zum ausführlichen Artikel, in dem Sie diese Attribute finden.

Vielen Dank an alle, die hier die besten Antworten geben !!

Variable Eigenschaftsattribute oder Modifikatoren in iOS

Hier ist die Beispielbeschreibung aus Artikel

  1. atomic -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-Accessoren in einer Umgebung ohne Speicherbereinigung (dh bei Verwendung von "Retain"/"Release"/"Autorelease") verwenden eine Sperre, um sicherzustellen, dass ein anderer Thread die korrekte Einstellung/das korrekte Abrufen nicht beeinträchtigt des Wertes. -es ist eigentlich kein Stichwort.

Beispiel

@property (retain) NSString *name;

@synthesize name;
  1. nonatomic -Nonatomic bedeutet, dass mehrere Threads auf die Variable zugreifen (dynamischer Typ). -Nonatomic ist Thread unsicher. -aber es ist schnell in der Leistung -Nonatomic ist NICHT das Standardverhalten, wir müssen nichtatomisches Schlüsselwort im Eigenschaftsattribut hinzufügen. -es kann zu unerwartetem Verhalten führen, wenn zwei verschiedene Prozesse (Threads) gleichzeitig auf dieselbe Variable zugreifen.

Beispiel:

@property (nonatomic, retain) NSString *name;

@synthesize name;

Erklären:

Angenommen, es gibt eine atomare Zeichenfolgeneigenschaft mit dem Namen "name". Wenn Sie [self setName: @ "A"] von Thread A aus aufrufen, rufen Sie [self setName: @ "B"] von Thread B aus auf und rufen Sie [self name] von auf Thread C, dann werden alle Operationen an verschiedenen Threads seriell ausgeführt, was bedeutet, dass andere Threads warten, wenn ein Thread Setter oder Getter ausführt. Dies macht den Lese-/Schreibzugriff auf die Eigenschaft "name" sicher. Wenn jedoch ein anderer Thread D gleichzeitig [name release] aufruft, kann dieser Vorgang zum Absturz führen, da hier kein Setter/Getter-Aufruf beteiligt ist. Das heißt, ein Objekt ist schreib-/lesesicher (ATOMIC), aber nicht threadsicher, da andere Threads gleichzeitig beliebige Nachrichten an das Objekt senden können. Entwickler sollten Thread-Sicherheit für solche Objekte gewährleisten.

Wenn die Eigenschaft "name" nicht atomar war, werden alle Threads in Beispiel A, B, C und D gleichzeitig ausgeführt und führen zu unvorhersehbaren Ergebnissen. Im Falle von atomar wird entweder A, B oder C zuerst ausgeführt, aber D kann immer noch parallel ausgeführt werden.

  1. strong (iOS4 = retain) -es sagt "behalte dies auf dem Haufen, bis ich nicht mehr darauf zeige" -in anderen Worten "I ' Ich bin der Besitzer, Sie können dies nicht aufheben, bevor Sie das gleiche Ziel wie "Beibehalten" festlegen. Sie verwenden "Stark" nur, wenn Sie das Objekt behalten müssen. - Standardmäßig sind alle Instanzvariablen und lokalen Variablen starke Zeiger. -Wir verwenden im Allgemeinen strong für UIViewControllers (übergeordnetes Element des UI-Elements). -Stark wird mit ARC verwendet und hilft Ihnen im Grunde, da Sie sich nicht um die Anzahl der beibehaltenen Objekte sorgen müssen. ARC gibt es automatisch für Sie frei, wenn Sie damit fertig sind. Wenn Sie das Schlüsselwort strong verwenden, bedeutet dies, dass Sie Eigentümer des Objekts sind.

Beispiel:

@property (strong, nonatomic) ViewController *viewController;

@synthesize viewController;
  1. schwach (iOS4 = unsafe_unretained) -es sagt "behalte dies so lange, wie jemand anderes stark darauf hinweist" -das gleiche wie zuweisen, kein behalten oder release - Eine "schwache" Referenz ist eine Referenz, die Sie nicht beibehalten. -Wir verwenden generell weak für IBOutlets (UIViewController's Childs). Dies funktioniert, weil das Child-Objekt nur so lange existieren muss, wie das Parent-Objekt existiert. -ein schwacher Verweis ist ein Verweis, der das referenzierte Objekt nicht vor der Erfassung durch einen Garbage Collector schützt. - Schwach ist im Wesentlichen eine nicht zurückbehaltene Eigenschaft. Außer wenn das Objekt freigegeben wird, wird der schwache Zeiger automatisch auf Null gesetzt

Beispiel

@property (weak, nonatomic) IBOutlet UIButton *myButton;

@synthesize myButton;

Starke und schwache Erklärung, Dank an BJ Homer :

Stellen Sie sich vor, unser Objekt ist ein Hund und der Hund möchte weglaufen (freigegeben werden). Starke Zeiger sind wie eine Leine am Hund. Solange Sie die Leine am Hund haben, rennt der Hund nicht weg. Wenn fünf Personen ihre Leine an einem Hund befestigen (fünf starke Zeiger auf einen Gegenstand), rennt der Hund nicht davon, bis alle fünf Leinen gelöst sind. Schwache Zeiger dagegen sind wie kleine Kinder, die auf den Hund zeigen und sagen: "Schau! Ein Hund!" Solange der Hund noch an der Leine ist, können die kleinen Kinder den Hund immer noch sehen und sie werden immer noch darauf zeigen. Sobald sich jedoch alle Leinen gelöst haben, rennt der Hund davon, egal wie viele kleine Kinder darauf zeigen. Sobald der letzte starke Zeiger (Leine) nicht mehr auf ein Objekt zeigt, wird die Zuordnung des Objekts aufgehoben und alle schwachen Zeiger werden auf Null gesetzt. Wann verwenden wir schwach? Das einzige Mal, dass Sie schwach verwenden möchten, ist, wenn Sie Beibehaltungszyklen vermeiden möchten (z. B. behält der Elternteil das Kind und das Kind den Elternteil bei, sodass keines von beiden jemals freigegeben wird).

  1. preserv = strong -it wird beibehalten, alter Wert wird freigegeben und zugewiesen -retain gibt an, dass der neue Wert gesendet werden soll -retain bei Zuweisung und der alte Wert gesendet -release -retain ist das gleiche wie stark. -Apple sagt, wenn Sie Schreiben behalten, wird es automatisch konvertiert/funktioniert nur wie stark. -Methoden wie "alloc" beinhalten ein implizites "retain"

Beispiel:

@property (nonatomic, retain) NSString *name;

@synthesize name;
  1. assign -assign ist die Standardeinstellung und führt einfach eine Variablenzuweisung durch. -assign ist ein Eigenschaftsattribut, das dem Compiler mitteilt, wie die Setter-Implementierung der Eigenschaft zu synthetisieren ist Verwenden Sie assign für C-Primitiveigenschaften und weak für schwache Verweise auf Objective-C-Objekte.

Beispiel:

@property (nonatomic, assign) NSString *address;

@synthesize address;
  1. unsafe_unretained

    -unsafe_unretained ist ein Besitzqualifikationsmerkmal, das ARC mitteilt, wie Retain/Release-Aufrufe eingefügt werden. -unsafe_unretained ist die ARC-Version von assign.

Beispiel:

@property (nonatomic, unsafe_unretained) NSString *nickName;

@synthesize nickName;
  1. copy -copy ist erforderlich, wenn das Objekt veränderbar ist. -copy gibt an, dass der neue Wert gesendet werden soll. -copy bei Zuweisung und der alte Wert gesendet. -release. -copy gibt ein Objekt zurück, das Sie explizit freigeben müssen (z. B. bei der Freigabe von Zuordnungen). -wenn Sie eine Kopie verwenden, müssen Sie diese noch in dealloc freigeben. -Verwenden Sie diese Option, wenn Sie den aktuellen Wert des Objekts benötigen und nicht möchten, dass dieser Wert Änderungen widerspiegelt, die von anderen Eigentümern des Objekts vorgenommen wurden. Sie müssen das Objekt freigeben, wenn Sie damit fertig sind, da Sie die Kopie behalten.

Beispiel:

@property (nonatomic, copy) NSArray *myArray;

@synthesize myArray;
146
swiftBoy

Auf atomare Eigenschaften kann jeweils nur von einem Thread zugegriffen werden. Es ist thread safe. Die Standardeinstellung ist atomar. Bitte beachten Sie, dass es kein Schlüsselwort atomar gibt

Nichtatomar bedeutet, dass mehrere Threads auf das Element zugreifen können. Es ist Thread unsicher

Daher sollte man bei der Verwendung von atomar sehr vorsichtig sein, da dies die Leistung des Codes beeinträchtigt

8
Kannan Prasad