Avant de connaître les attributs de @property, vous devez savoir à quoi sert @property.
@property offre un moyen de définir les informations qu'une classe est destinée à encapsuler. Si vous déclarez un objet / variable à l'aide de @property , cet objet / variable sera accessible aux autres classes qui importent sa classe.
Si vous déclarez un objet en utilisant @property dans le fichier d'en-tête, vous devez alors le synthétiser en utilisant @synthesize dans le fichier d'implémentation. Cela rend l'objet conforme KVC . Par défaut, le compilateur synthétisera les méthodes d'accesseur pour cet objet.
Les méthodes d'accesseur sont: setter et getter.
Exemple: .h
@interface XYZClass : NSObject
@property (nonatomic, retain) NSString *name;
@end
.m
@implementation XYZClass
@synthesize name;
@end
Le compilateur va maintenant synthétiser les méthodes d'accesseur pour le nom .
XYZClass *obj=[[XYZClass alloc]init];
NSString *name1=[obj name]; // get 'name'
[obj setName:@"liza"]; // first letter of 'name' becomes capital in setter method
Liste des attributs de @property
atomique, non atomique, conserver, copier, lecture seule, lecture-écriture, assigner, fort, getter = méthode, setter = méthode, unsafe_unretained
atomic est le comportement par défaut. Si un objet est déclaré atomique, il devient thread-safe. Thread-safe signifie qu'à la fois un seul thread d'une instance particulière de cette classe peut avoir le contrôle sur cet objet.
Si le thread exécute la méthode getter, aucun autre thread ne peut exécuter la méthode setter sur cet objet. C'est lent.
@property NSString *name; //by default atomic`
@property (atomic)NSString *name; // explicitly declared atomic`
- nonatomic n'est pas thread-safe. Vous pouvez utiliser l'attribut de propriété nonatomique pour spécifier que les accesseurs synthétisés définissent ou retournent simplement une valeur directement, sans aucune garantie de ce qui se passe si cette même valeur est accédée simultanément à partir de différents threads.
Pour cette raison, il est plus rapide d'accéder à une propriété non atomique qu'à une propriété atomique.
@property (nonatomic)NSString *name;
- conserver est requis lorsque l'attribut est un pointeur sur un objet.
La méthode de définition augmentera le nombre de rétentions de l'objet, de sorte qu'il occupera de la mémoire dans le pool de libération automatique.
@property (retain)NSString *name;
- copier Si vous utilisez la copie, vous ne pouvez pas utiliser la conservation. L'utilisation d'une instance de copie de la classe contiendra sa propre copie.
Même si une chaîne mutable est définie et modifiée par la suite, l'instance capture la valeur qu'elle a au moment où elle est définie. Aucune méthode setter et getter ne sera synthétisée.
@property (copy) NSString *name;
maintenant,
NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];
xyzObj.name = nameString;
[nameString appendString:@"Pizza"];
le nom ne sera pas affecté.
- en lecture seule Si vous ne souhaitez pas autoriser la modification de la propriété via la méthode setter, vous pouvez déclarer la propriété en lecture seule.
Le compilateur va générer un getter, mais pas un setter.
@property (readonly) NSString *name;
- readwrite est le comportement par défaut. Vous n'avez pas besoin de spécifier explicitement l'attribut readwrite.
C'est l'opposé de readonly.
@property (readwrite) NSString *name;
- assign va générer un setter qui affecte directement la valeur à la variable d'instance, plutôt que de la copier ou de la conserver. C'est le meilleur pour les types primitifs comme NSInteger et CGFloat, ou les objets que vous ne possédez pas directement, tels que les délégués.
Gardez à l'esprit que la conservation et l'attribution sont essentiellement interchangeables lorsque la récupération de place est activée.
@property (assign) NSInteger year;
- fort est un remplacement pour conserver.
Il est livré avec ARC.
@property (nonatomic, strong) AVPlayer *player;
- getter = method Si vous souhaitez utiliser un nom différent pour une méthode getter, il est possible de spécifier un nom personnalisé en ajoutant des attributs à la propriété.
Dans le cas des propriétés booléennes (propriétés qui ont une valeur OUI ou NON), il est habituel que la méthode getter commence par le mot «est»
@property (getter=isFinished) BOOL finished;
- setter = method Si vous souhaitez utiliser un nom différent pour une méthode setter, il est possible de spécifier un nom personnalisé en ajoutant des attributs à la propriété.
La méthode doit se terminer par deux points.
@property(setter = boolBool:) BOOL finished;
- unsafe_unretained Il existe quelques classes dans Cocoa et Cocoa Touch qui ne prennent pas encore en charge les références faibles, ce qui signifie que vous ne pouvez pas déclarer une propriété faible ou une variable locale faible pour en garder la trace. Ces classes incluent NSTextView, NSFont et NSColorSpace, etc. Si vous devez utiliser une référence faible à l'une de ces classes, vous devez utiliser une référence non sécurisée.
Une référence non sécurisée est similaire à une référence faible en ce qu'elle ne maintient pas en vie son objet associé, mais elle ne sera pas définie sur nil si l'objet de destination est désalloué.
@property (unsafe_unretained) NSObject *unsafeProperty;
Si vous devez spécifier plusieurs attributs, incluez-les simplement en tant que liste séparée par des virgules, comme ceci:
@property (readonly, getter=isFinished) BOOL finished;