Vor der Diskussion über die Attribute von @property, sollten Sie wissen, was die Verwendung von @property ist. @property bietet eine Möglichkeit, die Informationen zu definieren, die eine Klasse kapseln soll. Wenn Sie ein Objekt / Variable @property deklarieren, dann ist das Objekt / Variable auf andere Klassen importieren seiner Klasse zugänglich sein. Wenn Sie ein Objekt mit @property in der Header-Datei deklarieren, dann haben Sie es zu synthetisieren, in der Implementierungsdatei mit @synthesize.
Beispiel:
.h Klasse
@interface ExampleClass : NSObject
@property (nonatomic, retain) NSString *name;
@end
.m Klasse
@implementation ExampleClass
@synthesize name;
@end
Nun wird der Compiler Accessormethoden für Namen synthetisieren.
ExampleClass *newObject=[[ExampleClass alloc]init];
NSString *name1=[newObject name]; // get 'name'
[obj setName:@“Tiger”];
Liste der Attribute von @property: atomar. nonatomic. behalten. Kopieren. schreibgeschützt. lesen Schreiben. zuordnen. stark.
Atom: Es ist das Standardverhalten. Wenn ein Objekt als Atom deklariert wird, dann wird es Thread-sicher. Thread-safe-Einrichtung, zu einem Zeitpunkt nur ein Thread einer bestimmten Instanz dieser Klasse kann, hat die Kontrolle über das Objekt.
Beispiel:
@property NSString *name; //by default atomic
@property (atomic)NSString *name; // explicitly declared atomic
nonatomic: Es ist nicht Thread-sicher. Sie können die nicht-atomare Eigenschaft Attribut verwenden, um die synthetisiert Accessoren geben Sie einfach eingestellt oder direkt einen Wert zurückgeben, ohne Garantien über das, was passiert, wenn diese denselben Wert gleichzeitig von verschiedenen Threads zugegriffen wird. Aus diesem Grunde ist es schneller eine nicht-atomare Eigenschaft als ein Atom einer zuzugreifen.
@property (nonatomic)NSString *name;
behalten: erforderlich, wenn das Attribut ein Zeiger auf eine Objekts.Verfahren Setter-Methode ist erhöht Zählung des Objekts beibehalten, so dass es Speicher in Autofreigabepool besetzen wird.
@property (retain)NSString *name;
Kopie: Wenn Sie Kopie verwenden, können Sie nicht behalten verwenden. Kopie Instanz der Klasse verwendet, wird seine eigene Kopie enthalten. Selbst wenn eine veränderbare Zeichenfolge festgelegt wird und anschließend geändert wird, fängt die Instanz, was Wert, den es zur Zeit hat es gesetzt ist. Keine Setter und Getter-Methoden werden synthetisiert.
@property (copy) NSString *name;
NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];
xyzObj.name = nameString;
[nameString appendString:@"Pizza"];
Read-only: Wenn Sie die Eigenschaft über Setter-Methode geändert werden nicht zulassen wollen, können Sie die Eigenschaft Read-only erklären.
@property (readonly) NSString *name;
Lese-Schreib-: ist das Standardverhalten. Sie brauchen keine Lese-Schreib-Attribut explizit angeben.
@property (readwrite) NSString *name;
zuzuordnen: einen setter erzeugen, die den Wert auf die Instanzvariable, anstatt das Kopieren oder Halte direkt zuordnet. Dies ist am besten für primitive Typen wie NSInteger und CGFloat oder Objekte, die Sie nicht direkt, wie die Delegierten besitzen.
@property (assign) NSInteger year;
stark: ist ein Ersatz für behalten.
@property (nonatomic, strong) AVPlayer *player;
unsafe_unretained: Es gibt ein paar Klassen in Cocoa und Cocoa Touch, die noch keinen schwachen Verweis unterstützen, was bedeutet, dass Sie nicht eine schwache Eigenschaft oder schwache lokale Variable, um zu verfolgen, sie erklären können. Diese Klassen umfassen NSTextView, NSFont und NSColorSpace usw. Wenn Sie einen schwachen Verweis auf eine dieser Klassen verwenden müssen, müssen Sie eine unsichere Referenz verwenden. Eine unsichere Referenz ähnelt einem schwachen Verweis, dass es hält nicht mit ihrem verbundenen Objekt am Leben, aber es wird nicht auf Null gesetzt werden, wenn das Zielobjekt ist freigegeben.
@property (unsafe_unretained) NSObject *unsafeProperty;