102 votes

Les propriétés déclarées nécessitent-elles une variable d’instance correspondante ?

Biens immobiliers à Objective-C 2.0 nécessitent-elles une variable d’instance correspondante à déclarer ? Par exemple, je suis habitué à faire quelque chose comme ceci :

MyObject.h

MyObject.m

Cependant, que se passe-t-il si je l’ai fait à la place :

MyObject.h

Est-ce toujours valable ? Et c’est en quelque sorte différente de mon exemple précédent ?

94voto

jbrennan Points 7307

Si vous utilisez le Moderne Objective-C Runtime (qui est soit en iOS 3.x ou supérieur, ou 64 bits Snow Leopard ou plus), alors vous n'avez pas besoin de définir ivars de vos propriétés dans les cas de ce genre.

Lorsque vous @synthesize la propriété, le ivar va en effet être synthétisés aussi pour vous. Cela permet de contourner la "fragile-ivar" scénario. Vous pouvez en lire plus à ce sujet sur le Cacao avec l'Amour

71voto

PapaSmurf Points 1023

Dans votre interface, vous pouvez le déclarer officiellement une variable d'instance qui est entre les accolades, ou via @property à l'extérieur de l'appareil dentaire, ou les deux. De toute façon, ils deviennent des attributs de la classe. La différence est que si vous déclarez @property, alors vous pouvez mettre en œuvre à l'aide de @synthesize, ce qui auto-codes votre getter/setter pour vous. L'auto-coder setter initialise les nombres entiers et décimaux à zéro, par exemple. SI vous déclarez une variable d'instance, et NE spécifient PAS de correspondant en @property, alors vous ne pouvez pas utiliser @synthesize et doit écrire votre propre getter/setter.

Vous pouvez toujours remplacer l'auto-codé getter/setter en spécifiant votre propre. Ceci est généralement réalisé avec l' managedObjectContext de la propriété qui est paresseusement chargé. Ainsi, vous déclarez votre managedObjectContext comme une propriété, mais aussi à écrire une -(NSManagedObjectContext *)managedObjectContext méthode. Rappelons qu'une méthode, qui a le même nom qu'une variable d'instance ou de la propriété est le "getter" la méthode.

L' @property déclaration de méthode vous permet également d'autres options, comme retain et readonly, la variable d'instance de la déclaration de la méthode ne fonctionne pas. Fondamentalement, ivar à l'ancienne manière, et @property s'étend et il fait amateur/plus facile. Vous pouvez vous référer soit à l'aide de l'auto. préfixe, ou pas, il n'a pas d'importance tant que le nom est unique à cette classe. Sinon, si votre classe mère a le même nom d'une propriété que vous, alors vous avez à dire comme l'auto.nom ou super.nom afin de spécifier le nom de qui vous parlez.

Ainsi, vous verrez de moins en moins de gens déclarer ivars entre les accolades, et, au lieu de se décaler juste précisant @property, et ensuite de faire @synthesize. Vous ne pouvez pas faire @synthesize de votre mise en œuvre sans une correspondante @property. Le Synthétiseur ne sait quel type d'attribut est de l' @property de la spécification. Le synthétiser déclaration permet également de renommer propriétés, de sorte que vous pouvez vous référer à la propriété par un nom (abrégée) à l'intérieur de votre code, mais à l'extérieur dans la .h fichier utiliser le nom complet. Cependant, avec le vraiment cool de saisie semi-automatique que XCode a maintenant, c'est moins d'un avantage, mais il est toujours là.

Espérons que cela aide à dissiper la confusion et la désinformation qui est flottant autour de là-bas.

8voto

rickm Points 81

Il fonctionne de deux façons, mais si vous ne les déclarez dans les accolades, vous ne verrez pas leurs valeurs dans le débogueur dans xcode.

3voto

Charlie Elliott Points 101

À partir de la documentation:

En général, le comportement des propriétés est identique sur les deux moderne et de l'héritage des temps de fonctionnement (voir la section "Versions du moteur d'Exécution et les plates-formes" en Objective-C Runtime Guide de Programmation). Il existe une différence essentielle: le moderne runtime prend en charge variable d'instance de synthèse alors que l'héritage d'exécution ne l'est pas.

Pour @synthétiser de travailler dans l'héritage de l'exécution, vous devez fournir une instance de la variable avec le même nom et compatible avec le type de la propriété ou de spécifier une variable d'instance dans le @synthétiser déclaration. Avec les techniques modernes d'exécution, si vous ne fournissez pas une variable d'instance, le compilateur ajoute un pour vous.

3voto

Shafraz Buhary Points 300

Si vous êtes en utilisant XCode 4.4 ou tard, il va générer variable d'instance synthèse de code pour vous.

Vous avez juste à déclarer des propriétés comme ci-dessous; il va générer synthèse de code et de la variable d'instance déclarant code pour vous.

@property (nonatomic, strong) NSString *name;

il va générer synthèse de code comme

@synthesize name = _name;

et vous pouvez accéder à la variable d'instance à l'aide de _name il est semblable à déclarer

NSString* _name

mais si vous déclarez propriété en lecture seule comme

@property (nonatomic, strong, readonly) NSString *name;

il va générer du code

@synthesize name;

ou

@synthesize name = name; 

Donc, vous devriez accès instantané nom de la variable avec le préfixe "_" de toute façon, vous pouvez écrire votre propre synthèse de code que le compilateur va générer du code pour vous. vous pouvez écrire

@synthesize name = _name;

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