Avant de discuter sur les attributs de @property, vous devez savoir ce qui est l'utilisation de @property. @property offre un moyen de définir les informations qu'une classe est destinée à encapsuler. Si vous déclarez un objet / variable en utilisant @property, alors que l'objet / variable sera accessible aux autres classes importateurs de sa catégorie. Si vous déclarez un objet en utilisant @property dans le fichier d'en-tête, alors vous devez en faire la synthèse en utilisant @synthesize dans le fichier de mise en œuvre.
Exemple:
classe .h
@interface ExampleClass : NSObject
@property (nonatomic, retain) NSString *name;
@end
classe .m
@implementation ExampleClass
@synthesize name;
@end
Maintenant, le compilateur fera la synthèse des méthodes pour le nom accesseur.
ExampleClass *newObject=[[ExampleClass alloc]init];
NSString *name1=[newObject name]; // get 'name'
[obj setName:@“Tiger”];
Liste des attributs de @property: atomique. nonatomic. conserver. copie. lecture seulement. lire écrire. attribuer. fort.
atomique: Il est le comportement par défaut. Si un objet est déclaré comme atomique il devient alors thread-safe. des moyens de thread-safe, à la fois un seul fil d'une instance particulière de cette classe peuvent avoir le contrôle sur cet objet.
Exemple :
@property NSString *name; //by default atomic
@property (atomic)NSString *name; // explicitly declared atomic
nonatomic: Il n'est pas thread-safe. Vous pouvez utiliser l'attribut de propriété nonatomic pour spécifier que accesseurs synthétisés simplement définir ou renvoyer une valeur directement, sans aucune garantie sur ce qui se passe si cette même valeur est accessible simultanément à partir de différents threads. Pour cette raison, il est plus rapide d'accéder à une propriété nonatomic qu'un un atomique.
@property (nonatomic)NSString *name;
retenir: est nécessaire lorsque l'attribut est un pointeur vers une méthode setter objet.Le va augmenter le nombre de conserver l'objet, de sorte qu'il occupera la mémoire dans la piscine autorelease.
@property (retain)NSString *name;
copie: Si vous utilisez une copie, vous ne pouvez pas utiliser retenir. L'utilisation par exemple de copie de la classe contiendra sa propre copie. Même si une chaîne mutable est défini et modifié par la suite, l'instance capture quelle que soit la valeur qu'elle a au moment où elle est définie. Aucune méthode setter et getter seront synthétisés.
@property (copy) NSString *name;
NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];
xyzObj.name = nameString;
[nameString appendString:@"Pizza"];
readonly: Si vous ne souhaitez pas autoriser la propriété à modifier via la méthode setter, vous pouvez déclarer la propriété en lecture seule.
@property (readonly) NSString *name;
readwrite: est le comportement par défaut. Vous n'avez pas besoin de spécifier explicitement attribut readwrite.
@property (readwrite) NSString *name;
assigner: va générer un setter qui affecte la valeur de la variable d'instance directement, plutôt que de copier ou de son maintien. Il est préférable pour les types primitifs comme NSInteger et CGFloat ou objets que vous ne possédez pas directement, comme les délégués.
@property (assign) NSInteger year;
forte: est un remplacement pour conserver.
@property (nonatomic, strong) AVPlayer *player;
unsafe_unretained: Il y a quelques classes Cocoa et Cocoa Touch qui ne supportent pas encore des références faibles, ce qui signifie que vous ne pouvez pas déclarer une propriété faible ou faible variable locale de garder une trace d'eux. Ces classes comprennent NSTextView, NSFont et NSColorSpace, etc. Si vous avez besoin d'utiliser une faible référence à une de ces classes, vous devez utiliser une référence dangereuse. Une référence à risque est similaire à une référence faible en ce qu'elle ne tient pas son objet associé en vie, mais il ne sera pas mis à zéro si l'objet de destination est désaffectée.
@property (unsafe_unretained) NSObject *unsafeProperty;