En tant que débutant avec Objective-C, est-ce que quelqu'un peut me donner un aperçu général de la conservation, de la cession, de la copie et de tous les autres documents manquants qui suivent la directive @property? Que font-ils et pourquoi voudrais-je utiliser l'un plutôt que l'autre?
L'article lié à MrMage ne fonctionne plus. Donc, voici ce que j'ai appris dans mon codage (très) court en Objective-C:
nonatomic vs. atomic - "atomic" est la valeur par défaut. Toujours utiliser "nonatomic". Je ne sais pas pourquoi, mais le livre que j'ai lu disait qu'il y avait "rarement une raison" d'utiliser "atomique". (BTW: le livre que j'ai lu est le livre BNR "iOS Programming".)
readwrite vs readonly - "readwrite" est la valeur par défaut. Lorsque vous @ synthétisez, un getter et un passeur seront créés pour vous. Si vous utilisez "readonly", aucun séparateur ne sera créé. Utilisez-le pour une valeur que vous ne souhaitez jamais modifier après l'instanciation de l'objet.
conserver vs copier vs assigner
Avant de connaître les attributs de @property, vous devez savoir quelle est l’utilisation de @property.
@ property offre un moyen de définir les informations qu'une classe est censée encapsuler. Si vous déclarez un objet/une variable à l'aide de @ propriété, cet objet/cette variable sera accessible aux autres classes qui importent sa classe.
Si vous déclarez un objet à l'aide de @ property dans le fichier d'en-tête, vous devez le synthétiser à l'aide de @ synthesize dans le fichier d'implémentation. Cela rend l'objet conforme à KVC. Par défaut, le compilateur synthétisera méthodes d'accès pour cet objet.
les méthodes d'accès sont les suivantes: 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'accès pour 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 d'attributs de @ propriété
atomique, non atomique, conserver, copier, lire, écrire, assigner, fort, getter = méthode, setter = méthode, unsafe_unretained
atomic est le comportement par défaut. Si un objet est déclaré comme atomique, il devient thread-safe. Thread-safe signifie que, à 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`
Pour cette raison, il est plus rapide d’accéder à une propriété non atomique qu’à une propriété atomique.
@property (nonatomic)NSString *name;
La méthode de définition augmentera le nombre de conservations de l'objet, de sorte qu'il occupera de la mémoire dans le pool de libération automatique.
@property (retain)NSString *name;
Même si une chaîne modifiable est définie et modifiée par la suite, l'instance capture quelle que soit sa valeur au moment où elle est définie. Aucune méthode setter ni getter ne sera synthétisée.
@property (copy) NSString *name;
maintenant,
NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];
xyzObj.name = nameString;
[nameString appendString:@"Pizza"];
name restera inchangé.
Le compilateur générera un getter, mais pas un setter.
@property (readonly) NSString *name;
C'est le contraire de readonly.
@property (readwrite) NSString *name;
Gardez à l'esprit que conserver et affecter sont fondamentalement interchangeables lorsque la récupération de place est activée.
@property (assign) NSInteger year;
Il vient avec ARC.
@property (nonatomic, strong) AVPlayer *player;
Dans le cas de propriétés booléennes (propriétés qui ont une valeur YES ou NO), il est habituel que la méthode getter commence par le mot "is".
@property (getter=isFinished) BOOL finished;
La méthode devrait se terminer par deux points.
@property(setter = boolBool:) BOOL finished;
Une référence non sécurisée est similaire à une référence faible en ce sens qu’elle ne garde pas son objet associé en vie, mais 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;
Après avoir lu de nombreux articles, j'ai décidé de rassembler toutes les informations sur les attributs:
- atomique // par défaut
- non atomique
- fort = conserver // par défaut
- faible = non sécurisé_unretained
- conserver
- assign // valeur par défaut
- unsafe_unretained
- copie
- lecture seulement
- readwrite // par défaut
Vous trouverez ci-dessous un lien vers l'article détaillé où vous pouvez trouver ces attributs.
Un grand merci à toutes les personnes qui donnent les meilleures réponses ici !!
Attributs de propriété de variable ou modificateurs sous iOS
Voici l'exemple de description de l'article
Exemple :
@property (retain) NSString *name;
@synthesize name;
Exemple:
@property (nonatomic, retain) NSString *name;
@synthesize name;
Explique:
Supposons qu'il existe une propriété de chaîne atomique appelée "nom" et que, si vous appelez [nom du groupe: @ "A"] à partir du fil A, appelez [nom du groupe: @ "B"] à partir du fil B et appelez [nom du compte] thread C, toutes les opérations sur différents threads seront effectuées en série, ce qui signifie que si un thread exécute un programme de lecture ou un programme de lecture, les autres threads attendent. Ceci sécurise la propriété "name" en lecture/écriture, mais si un autre thread D appelle [nom de version] simultanément, cette opération risque de provoquer un blocage, car aucun appel setter/getter n'est impliqué ici. Ce qui signifie qu'un objet est sécurisé en lecture/écriture (ATOMIC) mais pas en sécurité des threads, car d'autres threads peuvent envoyer simultanément tout type de message à l'objet. Le développeur doit garantir la sécurité du filetage pour ces objets.
Si la propriété "name" n'était pas atomique, tous les threads de l'exemple ci-dessus - A, B, C et D s'exécuteront simultanément, produisant ainsi un résultat imprévisible. En cas d'atome, l'un ou l'autre de A, B ou C s'exécutera en premier mais D peut toujours s'exécuter en parallèle.
Exemple:
@property (strong, nonatomic) ViewController *viewController;
@synthesize viewController;
Exemple :
@property (weak, nonatomic) IBOutlet UIButton *myButton;
@synthesize myButton;
Explication forte et faible, Merci à BJ Homer :
Imaginez que notre objet soit un chien et que celui-ci veuille fuir (être désalloué). Les pointeurs forts sont comme une laisse sur le chien. Tant que vous avez la laisse attachée au chien, celui-ci ne s'enfuira pas. Si cinq personnes attachent leur laisse à un chien (cinq pointeurs puissants à un objet), le chien ne s'enfuira pas tant que les cinq laisses ne sont pas détachées. Les pointeurs faibles, par contre, sont comme des petits enfants qui pointent le chien et disent "Regarde! Un chien!" Tant que le chien est toujours en laisse, les petits enfants peuvent toujours le voir et ils le montrent du doigt. Dès que toutes les laisses sont détachées, cependant, le chien s'enfuit, peu importe le nombre de petits enfants qui le désignent. Dès que le dernier pointeur fort (laisse) ne pointe plus vers un objet, celui-ci sera désalloué et tous les pointeurs faibles seront mis à zéro. Quand on utilise faible? Si vous voulez éviter les cycles de rétention (par exemple, le parent conserve l’enfant et l’enfant le conserve pour qu’il ne soit jamais relâché).
Exemple:
@property (nonatomic, retain) NSString *name;
@synthesize name;
Exemple:
@property (nonatomic, assign) NSString *address;
@synthesize address;
unsafe_unretained
-unsafe_unretained est un qualificatif de propriété qui indique à ARC comment insérer des appels de conservation/libération. -unsafe_unretained est la version ARC de assign.
Exemple:
@property (nonatomic, unsafe_unretained) NSString *nickName;
@synthesize nickName;
Exemple:
@property (nonatomic, copy) NSArray *myArray;
@synthesize myArray;
La propriété Atomic est accessible à un seul thread à la fois. C'est thread safe. La valeur par défaut est atomique .Veuillez noter qu’il n’ya pas de mot clé atomique
Nonatomic signifie que plusieurs threads peuvent accéder à l'article. Il est thread unsafe
Il faut donc faire très attention en utilisant atomique. Comme cela affecterait les performances de votre code