En tant que personne novice en Objective-C, quelqu’un peut-il me donner un aperçu des fonctions de conservation, d’affectation, de copie et de tout ce qui me manque, conformément à la directive @property? Que font-ils et pourquoi voudrais-je en utiliser un sur un autre?
L’article lié à MrMage ne fonctionne plus. Donc, voici ce que j’ai appris dans mon (très) court temps de codage en Objective-C:
nonatomique vs atomique – “atomique” est la valeur par défaut. Toujours utiliser “nonatomique”. Je ne sais pas pourquoi, mais le livre que j’ai lu disait qu’il y avait “rarement une raison” d’utiliser “l’atome”. (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 setter seront créés pour vous. Si vous utilisez “readonly”, aucun setter ne sera créé. Utilisez-le pour une valeur que vous ne voulez pas changer après l’instanciation de l’object.
conserver vs copie vs assigner
Avant de connaître les atsortingbuts de @property, vous devez savoir quelle 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 object / variable à l’aide de @property , cet object / variable sera accessible aux autres classes important sa classe.
Si vous déclarez un object à 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’object KVC conforme . Par défaut, le compilateur synthétisera les méthodes d’ access pour cet object.
Les méthodes d’access sont: setter et getter.
Exemple: .h
@interface XYZClass : NSObject @property (nonatomic, retain) NSSsortingng *name; @end
.m
@implementation XYZClass @synthesize name; @end
Maintenant, le compilateur synthétisera les méthodes d’access pour le nom .
XYZClass *obj=[[XYZClass alloc]init]; NSSsortingng *name1=[obj name]; // get 'name' [obj setName:@"liza"]; // first letter of 'name' becomes capital in setter method
Liste des atsortingbuts de @property
atomique, non atomique, conserver, copier, en lecture seule, réécrire, assigner, fort, getter = méthode, setter = méthode, unsafe_unretained
atomique est le comportement par défaut. Si un object est déclaré comme atomique, il devient alors thread-safe. Thread-safe signifie qu’à la fois, un seul thread d’une instance particulière de cette classe peut contrôler cet object.
Si le thread exécute la méthode getter, alors un autre thread ne peut pas exécuter la méthode setter sur cet object. C’est lent.
@property NSSsortingng *name; //by default atomic` @property (atomic)NSSsortingng *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)NSSsortingng *name;
La méthode setter augmentera le compte de conservation de l’object, de sorte qu’il occupera la mémoire dans le pool d’autorelease.
@property (retain)NSSsortingng *name;
Même si une chaîne mutable est définie et modifiée par la suite, l’instance capture toute valeur dont elle dispose au moment où elle est définie. Aucune méthode setter et getter ne sera synthétisée.
@property (copy) NSSsortingng *name;
à présent,
NSMutableSsortingng *nameSsortingng = [NSMutableSsortingng ssortingngWithSsortingng:@"Liza"]; xyzObj.name = nameSsortingng; [nameSsortingng appendSsortingng:@"Pizza"];
le nom restra inchangé.
Le compilateur générera un getter, mais pas un setter.
@property (readonly) NSSsortingng *name;
C’est l’opposé de readonly.
@property (readwrite) NSSsortingng *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 est livré avec ARC.
@property (nonatomic, strong) AVPlayer *player;
Dans le cas des 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 doit se terminer par un deux-points.
@property(setter = boolBool:) BOOL finished;
Une référence non sécurisée est similaire à une référence faible dans la mesure où elle ne conserve pas son object associé en vie, mais elle ne sera pas définie sur zéro si l’object de destination est désalloué.
@property (unsafe_unretained) NSObject *unsafeProperty;
Si vous devez spécifier plusieurs atsortingbuts, incluez-les simplement comme une 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 atsortingbuts:
- atomique // par défaut
- non atomique
- fort = conserver // défaut
- faible = unsafe_unretained
- conserver
- assigner // par défaut
- unsafe_unretained
- copie
- lecture seulement
- readwrite // default
Vous trouverez ci-dessous un lien vers l’article détaillé où vous pouvez trouver ces atsortingbuts.
Un grand merci à toutes les personnes qui donnent les meilleures réponses ici !!
Atsortingbuts de propriété de variable ou modificateurs dans iOS
Voici l’exemple de description de l’article
Exemple :
@property (retain) NSSsortingng *name; @synthesize name;
Exemple:
@property (nonatomic, retain) NSSsortingng *name; @synthesize name;
Explique:
Supposons qu’il existe une propriété de chaîne atomique appelée “name”, et si vous appelez [self setName: @ “A”] à partir du thread A, appelez [self setName: @ “B”] à partir du thread B, et appelez [self name] from thread C, alors toutes les opérations sur des threads différents seront effectuées en série, ce qui signifie que si un thread exécute setter ou getter, alors d’autres threads attendent. Cela rend la propriété “name” en lecture / écriture sûre, mais si un autre thread D appelle [release release] simultanément, cette opération peut provoquer un plantage car aucun appel setter / getter n’est impliqué ici. Ce qui signifie qu’un object est en lecture / écriture sécurisé (ATOMIC) mais pas thread-safe car un autre thread peut envoyer simultanément n’importe quel type de message à l’object. Le développeur doit assurer la sécurité des threads pour ces objects.
Si la propriété “name” était non atomique, alors tous les threads de l’exemple ci-dessus – A, B, C et D s’exécuteront simultanément, produisant un résultat imprévisible. En cas d’atome, Soit l’un des A, B ou C s’exécutera en premier mais D pourra 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 object soit un chien et que le chien veuille s’enfuir (soit désalloué). Les pointeurs forts sont comme une laisse sur le chien. Tant que vous avez la laisse attachée au chien, le chien ne va pas fuir. Si cinq personnes attachent leur laisse à un chien (cinq pointeurs forts sur un object), le chien ne s’enfuira pas avant que les cinq laisses ne soient détachées. Les pointeurs faibles, d’autre part, sont comme des petits enfants qui pointent vers le chien et disent: “Regardez! Un chien!” Tant que le chien est toujours en laisse, les petits peuvent encore voir le chien, et ils le montreront toujours. Dès que toutes les laisses sont détachées, le chien s’enfuit peu importe le nombre de petits enfants qui le pointent. Dès que le dernier pointeur fort (leash) ne pointe plus vers un object, l’object sera libéré et tous les pointeurs faibles seront mis à zéro. Quand on utilise faible? Le seul moment où vous voudriez utiliser des faiblesses, c’est si vous vouliez éviter les cycles de rétention (par exemple, le parent conserve l’enfant et l’enfant conserve le parent, donc aucun n’est libéré).
Exemple:
@property (nonatomic, retain) NSSsortingng *name; @synthesize name;
Exemple:
@property (nonatomic, assign) NSSsortingng *address; @synthesize address;
unsafe_unretained
-unsafe_unretained est un qualificatif de propriété qui indique à ARC comment insérer des appels de conservation / de libération -unsafe_unretained est la version ARC de assign.
Exemple:
@property (nonatomic, unsafe_unretained) NSSsortingng *nickName; @synthesize nickName;
Exemple:
@property (nonatomic, copy) NSArray *myArray; @synthesize myArray;
La propriété atomique est accessible par un seul thread à la fois. C’est thread-safe . La valeur par défaut est atomique. Veuillez noter qu’il n’y a pas de mot clé atomique
Nonatomique signifie que plusieurs threads peuvent accéder à l’élément.
Donc, il faut être très prudent lors de l’utilisation de l’atome. Comme cela affecte les performances de votre code