230 votes

@biens et de conserver, céder, copier, nonatomic en Objective-C

Comme quelqu'un qui est nouveau pour Objective-C quelqu'un peut-il me donner un aperçu de le conserver, céder, copier et tout les autres je suis absent, suivez les @property directive? Que font-ils et pourquoi voudrais-je utiliser l'un plutôt qu'un autre?

311voto

liza Points 1042

Avant que vous savez sur les attributs de @de la propriété, vous devez savoir qu'est-ce que l'utilisation de @property.

  • @la propriété offre un moyen de définir les informations qu'une classe est destiné à encapsuler. Si vous déclarez un objet/variable à l'aide de @property, alors que l'objet/variable sera accessible à d'autres classes de l'importation de sa catégorie.

  • Si vous déclarez un objet à l'aide de @propriété dans le fichier d'en-tête, alors vous devez en faire la synthèse, à l'aide de @synthétiser dans le fichier d'implémentation. Cela fait l'objet KVC conforme. Par défaut, le compilateur va synthétiser des méthodes accesseur pour cet objet.

  • méthodes d'accès sont : setter et getter.

Exemple: .h

@interface XYZClass : NSObject
@property (nonatomic, retain) NSString *name;
@end

.m

@implementation XYZClass
@synthesize name;
@end

Maintenant que le compilateur fera la synthèse des méthodes 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, nonatomic, retain, copie, readonly, readwrite, céder, forte, getter=méthode, setter=méthode, unsafe_unretained

  • atomique est le comportement par défaut. Si un objet est déclaré comme atomique, puis il devient thread-safe. "Thread-safe" s'entend, à un moment, un seul fil d'une instance particulière de la classe peut avoir le contrôle sur cet objet.

Si le thread exécute méthode de lecture puis de l'autre thread ne peut pas effectuer le setter de la méthode sur cet objet. Il est lent.

@property NSString *name; //by default atomic`
@property (atomic)NSString *name; // explicitly declared atomic`
  • nonatomic n'est pas thread-safe. Vous pouvez utiliser le nonatomic propriété d'attribut pour spécifier que la synthèse des accesseurs suffit de définir ou de retourner une valeur directement, avec aucune garantie à propos de ce qui se passe si la même valeur est accessible simultanément à partir de différents threads.

Pour cette raison, il est plus rapide d'accéder à un nonatomic propriété de l'atome.

@property (nonatomic)NSString *name;   
  • conserver est nécessaire lorsque l'attribut est un pointeur vers un objet.

La méthode setter augmentera conserver compter de l'objet, de sorte qu'il occupera de la mémoire dans l'autorelease pool.

@property (retain)NSString *name;
  • copie Si vous utilisez la fonction copier, vous ne pouvez pas utiliser à retenir. À l'aide de la copie de l'instance de la classe va contenir sa propre copie.

Même si une mutable chaîne est définie et modifiée par la suite, l'instance capture quelle que soit la valeur qu'elle a au moment où elle est définie. Pas de setter et getter méthodes seront synthétisés.

@property (copy) NSString *name;

maintenant,

NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];    
xyzObj.name = nameString;    
[nameString appendString:@"Pizza"]; 

nom restera inchangée.

  • readonly Si vous ne souhaitez pas autoriser la propriété d'être modifié via la méthode de définition, vous pouvez déclarer la propriété readonly.

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 readwrite attribut explicitement.

Il est à l'opposé de lecture-seule.

@property (readwrite) NSString *name;
  • attribuer va générer un setter qui affecte la valeur de la variable d'instance directement, plutôt que de copier ou de les conserver. C'est le meilleur pour les types primitifs comme NSInteger et CGFloat, ou les objets que vous n'avez pas directement, tels que des délégués.

Gardez à l'esprit de conserver et de les assigner sont fondamentalement interchangeables lors de la collecte des ordures est activé.

@property (assign) NSInteger year;
  • forte est un remplacement pour les conserver.

Il est livré avec un ARC.

@property (nonatomic, strong) AVPlayer *player; 
  • getter=méthode Si vous souhaitez utiliser un nom différent pour une méthode de lecture, il est possible de spécifier un nom personnalisé par l'ajout d'attributs de la propriété.

Dans le cas de propriétés Booléennes (des propriétés qui ont une valeur OUI ou NON), il est de coutume pour la méthode de lecture à commencer par le mot "est"

@property (getter=isFinished) BOOL finished;
  • setter=méthode Si vous souhaitez utiliser un nom différent pour une méthode de définition, il est possible de spécifier un nom personnalisé par l'ajout d'attributs de la propriété.

La méthode doit se terminer par un point-virgule.

@property(setter = boolBool:) BOOL finished;
  • unsafe_unretained Il y a quelques classes Cocoa et Cocoa Touch qui ne sont pas encore en charge les références faibles, ce qui signifie que vous ne pouvez pas déclarer une faiblesse de la propriété ou de la faiblesse de la variable locale pour garder une trace d'eux. Ces classes comprennent NSTextView, NSFont et NSColorSpace,etc. Si vous avez besoin d'utiliser une faible référence à l'une de ces classes, vous devez utiliser un dangereux référence.

Un dangereux référence est similaire à une référence faible en ce qu'elle ne sait pas garder son objet vivant, mais il ne sera pas mis à néant si l'objet de destination est libéré.

@property (unsafe_unretained) NSObject *unsafeProperty;

Si vous avez besoin de spécifier plusieurs attributs, il suffit de les inclure comme une liste séparée par des virgules, comme ceci:

@property (readonly, getter=isFinished) BOOL finished;

284voto

Blamdarot Points 1517

L'article lié par MrMage ne fonctionne plus. Donc, voici ce que j'ai appris dans mon (très) court de temps à coder en Objective-C:

nonatomic vs atomique - "atomique" est la valeur par défaut. Toujours utiliser "nonatomic". Je ne sais pas pourquoi, mais le livre que j'ai lu, dit-il, est "rarement une raison" d'utiliser "atomique". (BTW: Le livre que j'ai lu est la BNR "iOS Programmation" livre.)

readwrite vs readonly - "readwrite" est la valeur par défaut. Lorsque vous @synthétiser, à la fois un getter et un setter sera créé pour vous. Si vous utilisez "readonly", pas de setter sera créé. L'utiliser pour une valeur que vous ne voulez pas de toujours changer après l'instanciation de l'objet.

conserver vs copie vs attribuer

  • "assign" est la valeur par défaut. Dans le setter qui est créé par @synthétiser, la valeur sera tout simplement être affectée à l'attribut. Ma compréhension est que "assigner" devrait être utilisé à des fins non-pointeur attributs.
  • "conserver" est nécessaire lorsque l'attribut est un pointeur vers un objet. Le setter généré par @synthétiser conservera (aka ajouter un retain count) de l'objet. Vous aurez besoin de libérer l'objet lorsque vous avez terminé avec elle.
  • "copie" est nécessaire lorsque l'objet est mutable. Utilisez cette option si vous avez besoin de la valeur de l'objet, c'est à ce moment, et vous ne voulez pas que la valeur pour refléter les modifications apportées par les autres propriétaires de l'objet. Vous aurez besoin de libérer l'objet lorsque vous avez terminé avec elle parce que vous faites de la rétention de la copie.

161voto

RDC Points 9222

Après avoir lu de nombreux articles, j'ai décidé de mettre tous les attributs de l'information ensemble:

  1. atomique //par défaut
  2. nonatomic
  3. fort=conserver //par défaut
  4. faible= unsafe_unretained
  5. conserver
  6. attribuer //par défaut
  7. unsafe_unretained
  8. copie
  9. readonly
  10. readwrite //par défaut

Ci-dessous un lien vers l'article détaillé où vous pouvez trouver ces attributs.

Un grand merci à toutes les personnes qui donnent de meilleures réponses ici!!

Variable de la propriété des attributs ou des Modificateurs dans iOS

Voici la Description de l'Échantillon de l'Article

  1. atomique -Atomique-dire qu'un seul thread d'accéder à la variable(de type statique). -Atomique est thread-safe. -mais il est lent en performance -atomique est le comportement par défaut -Atomique accesseurs non les ordures collectées environnement (c'est à dire lors de l'utilisation de conserver/presse/autorelease) utiliser un verrou à s'assurer qu'un autre thread ne pas interférer avec le bon paramètre/l'obtention de la valeur. -il n'est pas véritablement un mot-clé.

Exemple :

@property (retain) NSString *name;

@synthesize name;
  1. nonatomic -Nonatomic-à-dire plusieurs thread accéder à la variable(de type dynamique). -Nonatomic est thread dangereux. -mais il est rapide dans la performance -Nonatomic n'est PAS le comportement par défaut,nous avons besoin d'ajouter nonatomic mot-clé dans la propriété de l'attribut. -il peut entraîner un comportement inattendu, lorsque deux processus (les threads) pour accéder à la même variable en même temps.

Exemple:

@property (nonatomic, retain) NSString *name;

@synthesize name;

Expliquer:

Supposons que l'on atomique chaîne de propriété appelée "nom", et si vous appelez [auto setName:@"A"] à partir d'Un thread, appel [auto setName:@"B"] de fil B, et de les appeler [auto] nom du filetage C, puis toutes les opérations sur les différents thread sera effectué en série, ce qui signifie que si un thread est en cours d'exécution setter ou de lecture, puis d'autres threads en attente. Cela rend la propriété "name" de lecture/écriture sûr, mais si un autre thread D appels de [nom de la release] simultanément, cette opération est susceptible de produire un accident, car il n'y a pas de setter/getter appel en cause ici. Ce qui signifie qu'un objet est en lecture/écriture coffre-fort (ATOMIQUE), mais pas "thread-safe" comme un autre threads peuvent envoyer simultanément n'importe quel type de messages à l'objet. Développeur doit s'assurer de la sécurité des threads pour de tels objets.

Si la propriété "name" a été nonatomic, alors que tous les threads dans l'exemple ci-dessus - A,B, C et D exécuter simultanément à produire un résultat imprévisible. Dans le cas de l'atome, Soit l'un des A, B ou C sera exécuté en premier, mais D peuvent encore s'exécuter en parallèle.

  1. forte (iOS4 = conserver ) -il dit: "gardez cela dans le tas jusqu'à ce que je n'ai pas de point de plus". -en d'autres termes, "je suis le propriétaire, vous ne pouvez pas dealloc ce avant de viser correctement avec la même retenir" -Vous utiliser seulement si vous avez besoin de conserver l'objet. -Par défaut, toutes les variables d'instance et les variables locales sont fortes présomptions. -Nous utilisons généralement forte pour UIViewControllers (INTERFACE utilisateur de l'élément de parents) -forte est utilisé avec l'ARC et qu'il est fondamentalement vous permet , en n'ayant pas à se soucier de conserver le comte d'un objet. ARC libère automatiquement pour vous lorsque vous avez fini avec elle.En utilisant le mot-clé forte signifie que vous êtes propriétaire de l'objet.

Exemple:

@property (strong, nonatomic) ViewController *viewController;

@synthesize viewController;
  1. faible (iOS4 = unsafe_unretained ) -il est dit que "garder cette aussi longtemps que quelqu'un d'autre points à elle fortement" -la même chose que de céder, pas de conserver ou de libération -Un "faible" de référence est une référence que vous n'avez pas conservé. -Nous utilisons généralement faible pour IBOutlets (UIViewController de l'Enfant).Cela fonctionne parce que l'enfant objet uniquement doit exister aussi longtemps que l'objet parent. -une faiblesse de référence est une référence qui ne protège pas l'objet référencé à partir de la collecte par un garbage collector. -Faible est essentiellement attribuer, consignes de propriété. Sauf lorsque l'objet est libéré de la faiblesse de pointeur est automatiquement mis à zéro

Exemple :

@property (weak, nonatomic) IBOutlet UIButton *myButton;

@synthesize myButton;

Fort & Faible Explication, Grâce à BJ Homère:

Imaginez notre objet est un chien et que le chien a envie de fuir (être libéré). De fortes présomptions sont comme une laisse sur le chien. Tant que vous avez la laisse attachée au chien, le chien ne s'en ira pas. Si cinq personnes de joindre leur laisse d'un chien, (cinq de fortes présomptions pour qu'un seul objet), puis le chien ne s'en ira pas jusqu'à ce que tous les cinq laisses sont détachés. Des pointeurs faibles, d'autre part, sont comme de petits enfants, pointant vers le chien et dire "Regardez! Un chien!" Tant que le chien est encore sur la laisse, les petits enfants peuvent encore voir le chien, et ils vont encore point. Dès que tous les laisses sont détachés, cependant, le chien s'enfuit de la maison, peu importe combien de petits enfants qui sont pointant vers elle. Dès que le dernier fort pointeur (laisse) ne pointe plus vers un objet, l'objet sera libéré, et tous des pointeurs faibles seront remis à zéro. Lorsque nous utilisons des faibles? Le seul moment où vous souhaitez utiliser la faiblesse, c'est que si vous voulais éviter de conserver des cycles (par exemple, le parent conserve l'enfant et l'enfant conserve son parent, n'est jamais sorti).

  1. conserver = fort -il est retenu, l'ancienne valeur est sorti et il est attribué -conserver indique la nouvelle valeur doit être envoyée à retenir sur l'affectation et l'ancienne valeur envoyé à libération -retenir est le même que forte. -apple, si vous écrivez le conserver, il sera automatiquement converti/travail comme forte. -méthodes comme "alloc" incluent un implicite "conserver"

Exemple:

@property (nonatomic, retain) NSString *name;

@synthesize name;
  1. attribuer -assigner par défaut et simplement effectue une affectation de variable -assigner un attribut de propriété qui indique au compilateur comment synthétiser la propriété de définition de la mise en œuvre -Je voudrais l'utiliser pour attribuer C primitive des propriétés et de la faible pour de la faiblesse des références à Objective-C objets.

Exemple:

@property (nonatomic, assign) NSString *address;

@synthesize address;
  1. unsafe_unretained

    -unsafe_unretained est une propriété qualificatif qui indique ARC comment insérer conserver/appels de libération -unsafe_unretained est l'ARC version de céder.

Exemple:

@property (nonatomic, unsafe_unretained) NSString *nickName;

@synthesize nickName;
  1. copie -copie est nécessaire lorsque l'objet est mutable. -copie indique la nouvelle valeur doit être envoyé copie sur l'affectation et l'ancienne valeur envoyé à libération. -copie est comme retenir renvoie un objet que vous devez libérer explicitement (par exemple, dans le dealloc) en non-ordures collectées environnements. -si vous utilisez la fonction copier puis vous avez encore besoin de libération que dans le dealloc. -Utilisez cette option si vous avez besoin de la valeur de l'objet, c'est à ce moment, et vous ne voulez pas de cette valeur afin de refléter les modifications apportées par d'autres les propriétaires de l'objet. Vous aurez besoin de libérer l'objet lorsque vous avez terminé avec elle parce que vous faites de la rétention de la copie.

Exemple:

@property (nonatomic, copy) NSArray *myArray;

@synthesize myArray;

11voto

Kannan Prasad Points 637

Propriété de l'atome peut être accessible par un seul thread à la fois. Il est thread-safe. Par défaut est atomique .Veuillez noter qu'il n'y a pas de mot-clé atomique

Nonatomic - à-dire plusieurs thread peut accéder à l'élément .Il est dangereux fil

Il faut donc être très prudent lors de l'utilisation atomique .Comme il affecter les performances de votre code

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X