Kann mir jemand, der neu in Objective-C ist, einen Überblick über das Aufbewahren, Zuweisen, Kopieren und andere fehlende Elemente geben, die der @ property-Direktive folgen? Was machen sie und warum sollte ich sie übereinander verwenden wollen?
Kann mir jemand, der neu in Objective-C ist, einen Überblick über das Aufbewahren, Zuweisen, Kopieren und andere fehlende Elemente geben, die der @ property-Direktive folgen? Was machen sie und warum sollte ich sie übereinander verwenden wollen?
Antworten:
Der von MrMage verlinkte Artikel funktioniert nicht mehr. Folgendes habe ich in meiner (sehr) kurzen Zeitcodierung in Objective-C gelernt:
nichtatomar vs. atomar - "atomar" ist die Standardeinstellung. Verwenden Sie immer "nichtatomar". Ich weiß nicht warum, aber das Buch, das ich gelesen habe, sagte, dass es "selten einen Grund" gibt, "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 verwenden, werden sowohl ein Getter als auch ein Setter für Sie erstellt. Wenn Sie "schreibgeschützt" verwenden, wird kein Setter erstellt. Verwenden Sie es für einen Wert, den Sie nach der Instanziierung des Objekts nicht mehr ändern möchten.
behalten vs. kopieren vs. zuweisen
atomic
ist genauso schlecht wie die Empfehlung nonatomic
. Keine der beiden Optionen ist die "richtige", daher entschieden sich die Sprachdesigner für die sicherere der beiden Lösungen. In der Tat nonatomic
ist im Allgemeinen die bessere Wahl, da extrem teure Gewindesperren weggelassen werden. Der einzige Grund für die Verwendung atomic
besteht darin, dass Ihre Eigenschaft möglicherweise aus mehreren Threads besteht (in diesem Fall kann das Auslassen zu einer Überfreigabe oder einem Leck führen).
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, die ihre Klasse importieren, auf dieses Objekt / diese Variable zugreifen .
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-konform . 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
Jetzt synthetisiert der Compiler Accessor-Methoden für den Namen .
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
Atomic ist das Standardverhalten. Wenn ein Objekt als atomar deklariert ist, wird es threadsicher. Thread-sicher bedeutet, dass jeweils nur ein Thread einer bestimmten Instanz dieser Klasse die Kontrolle über dieses Objekt haben kann.
Wenn der Thread eine Getter-Methode ausführt, kann ein anderer Thread keine Setter-Methode für dieses Objekt ausführen. Es ist langsam.
@property NSString *name; //by default atomic`
@property (atomic)NSString *name; // explicitly declared atomic`
Aus diesem Grund ist der Zugriff auf eine nichtatomare Eigenschaft schneller als auf eine atomare.
@property (nonatomic)NSString *name;
Die Setter-Methode erhöht die Aufbewahrungsanzahl des Objekts, sodass es den Speicher im Autorelease-Pool belegt.
@property (retain)NSString *name;
Selbst 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.
Der Compiler generiert einen Getter, aber keinen Setter.
@property (readonly) NSString *name;
Es ist das Gegenteil von readonly.
@property (readwrite) NSString *name;
Beachten Sie, dass Beibehalten und Zuweisen grundsätzlich austauschbar sind, wenn die Speicherbereinigung aktiviert ist.
@property (assign) NSInteger year;
Es kommt mit ARC.
@property (nonatomic, strong) AVPlayer *player;
Bei booleschen Eigenschaften (Eigenschaften mit einem JA- oder NEIN-Wert) beginnt die Getter-Methode üblicherweise mit dem Wort "is".
@property (getter=isFinished) BOOL finished;
Die Methode sollte mit einem Doppelpunkt enden.
@property(setter = boolBool:) BOOL finished;
Eine unsichere Referenz ähnelt einer schwachen Referenz dahingehend, dass das zugehörige Objekt nicht am Leben bleibt, jedoch nicht auf Null 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 hinzu:
@property (readonly, getter=isFinished) BOOL finished;
@property
in der Header - Datei, dann Sie müssen es synthetisieren unter Verwendung @synthesize
in der Implementierungsdatei.“ Nicht immer. Beispiel: "Standardmäßig wird eine readwrite
Eigenschaft durch eine Instanzvariable gesichert, die vom Compiler automatisch wieder synthetisiert wird." Aus doc .
Nachdem ich viele Artikel gelesen hatte, beschloss ich, alle Attributinformationen zusammenzustellen:
- atomar // Standard
- nichtatomar
- strong = beibehalten // Standard
- schwach = unsicher_unretained
- behalten
- // Standard zuweisen
- unsafe_unretained
- Kopieren
- schreibgeschützt
- readwrite // default
Unten finden Sie einen Link zu dem ausführlichen Artikel, in dem Sie diese Attribute finden.
Vielen Dank an alle, die hier die besten Antworten geben !!
Hier ist die Beispielbeschreibung aus dem Artikel
Beispiel:
@property (retain) NSString *name;
@synthesize name;
Beispiel:
@property (nonatomic, retain) NSString *name;
@synthesize name;
Erklären:
Angenommen, es gibt eine atomare Zeichenfolgeeigenschaft 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. Wenn also ein Thread Setter oder Getter ausführt, warten andere Threads. Dies macht das Lesen / Schreiben der Eigenschaft "Name" sicher, aber wenn ein anderer Thread D gleichzeitig [Namensfreigabe] aufruft, kann dieser Vorgang einen Absturz verursachen, da hier kein Setter / Getter-Aufruf beteiligt ist. Dies bedeutet, dass ein Objekt schreib- / schreibsicher (ATOMIC), aber nicht threadsicher ist, da andere Threads gleichzeitig jede Art von Nachrichten an das Objekt senden können. Entwickler sollten die Thread-Sicherheit für solche Objekte gewährleisten.
Wenn die Eigenschaft "Name" nichtatomar war, werden alle Threads im obigen Beispiel - A, B, C und D gleichzeitig ausgeführt und erzeugen ein unvorhersehbares Ergebnis. Im Fall von Atomic wird entweder A, B oder C zuerst ausgeführt, D kann jedoch weiterhin parallel ausgeführt werden.
Beispiel:
@property (strong, nonatomic) ViewController *viewController;
@synthesize viewController;
Beispiel:
@property (weak, nonatomic) IBOutlet UIButton *myButton;
@synthesize myButton;
Starke und schwache Erklärung, danke 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 befestigt haben, rennt der Hund nicht weg. Wenn fünf Personen ihre Leine an einem Hund befestigen (fünf starke Zeiger auf ein Objekt), rennt der Hund nicht weg, bis alle fünf Leinen gelöst sind. Schwache Zeiger hingegen 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 noch sehen und sie werden immer noch darauf zeigen. Sobald jedoch alle Leinen gelöst sind, rennt der Hund weg, 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, wenn Sie schwach verwenden möchten, ist, wenn Sie Aufbewahrungszyklen vermeiden möchten (z. B. behält der Elternteil das Kind und das Kind behält den Elternteil, sodass keiner jemals freigegeben wird).
Beispiel:
@property (nonatomic, retain) NSString *name;
@synthesize name;
Beispiel:
@property (nonatomic, assign) NSString *address;
@synthesize address;
unsafe_unretained
-unsafe_unretained ist ein Besitzqualifikationsmerkmal, das ARC mitteilt, wie Aufbewahrungs- / Freigabeaufrufe eingefügt werden sollen. -unsafe_unretained ist die ARC-Version von assign.
Beispiel:
@property (nonatomic, unsafe_unretained) NSString *nickName;
@synthesize nickName;
Beispiel:
@property (nonatomic, copy) NSArray *myArray;
@synthesize myArray;
Auf die atomare Eigenschaft kann jeweils nur ein Thread zugreifen. Es ist threadsicher . Die Standardeinstellung ist atomar. Bitte beachten Sie, dass kein Schlüsselwort atomar vorhanden ist
Nichtatomar bedeutet, dass mehrere Threads auf das Element zugreifen können. Der Thread ist unsicher
Daher sollte man bei der Verwendung von Atomic sehr vorsichtig sein, da dies die Leistung Ihres Codes beeinträchtigt
bevorzugen Sie diese Links über Eigenschaften in Objective-C in iOS ...
https://techguy1996.blogspot.com/2020/02/properties-in-objective-c-ios.html