Si vous avez une variable, il existe deux façons de lire et de définir les propriétés (qui sont généralement une combinaison de méthodes ivar et accessor). L'ancienne (encore préféré par certains) est d'utiliser directement les accesseurs:
//MYObject *obj, with int property foo
int i = [obj foo]
[obj setFoo:32]
La nouvelle méthode consiste à utiliser de syntaxe à point (qui ne fonctionne que pour les propriétés, et ne peut pas être utilisé avec des méthodes plus compliquées):
int i = obj.foo //equivalent to [obj foo]
obj.foo = 32 //equivalent to [obj setFoo:32]
Si cela est vous confondre, je vous recommande fortement ramasser une copie de Aaron Hillegass's book. Il explique en détail Cocoa et Objective-C.
EDIT: Je pense qu'une partie de la confusion est ici avec la terminologie. En Objective-C, la plupart des objets ont des variables d'instance (ivars), qui stockent réellement les données. Cependant, en général, vous voulez éviter d'accéder directement aux ivars, en particulier à partir d'autres objets. (Ceci est un principe de conception orientée objet, et n'est pas vraiment spécifique à Objective-C.)
La raison principale de ceci est d'augmenter la flexibilité - si j'ai une classe Person
qui a une variable d'instance age
Par exemple, je pourrais vouloir changer ma mise en œuvre dans le futur pour déterminer dynamiquement l'âge. Si d'autres classes s'appuient sur la variable d'instance age
, elles se rompent lorsque l'implémentation change.
Le moyen de contourner ce problème consiste à utiliser des accesseurs, qui sont des méthodes qui contrôlent l'accès à un ivar. En Objective-C, les "getters" obtiennent la variable, et sont généralement nommés comme la variable (donc dans l'exemple Person
, le getter serait -(int)age
) et "setters" définirait la variable (elle serait nommée -(void)setAge:(int)theAge
). Si vous utilisez des accesseurs, vous pouvez modifier votre implémentation à l'avenir, en supprimant complètement l'ivar si nécessaire, sans que les classes dépendantes ne se brisent. En Objective-C, la combinaison d'un ivar et des accesseurs est souvent appelée une "propriété" (bien qu'il ne soit pas nécessaire d'être un ivar, si la valeur est créée dynamiquement). Si vous pensez en termes de propriétés, vous n'avez pas à vous soucier des ivars dans d'autres classes - ce sont des détails de mise en œuvre. Objective-C 2.0 a une belle sucre syntaxique pour la création de propriétés:
//Person.h
@interface Person : NSObject {
int age;
}
@property (assign) int age; //declares the accessors
@end
//Person.m
@implementation Person
@synthesize age; //implements -(int)age and -(void)setAge:theAge
@end
La chose importante à retenir est la plupart du temps, vous devriez penser en termes de propriétés plutôt que Ivars. Vous ne devriez jamais accéder directement aux ivars dans d'autres classes. Vous devriez rarement (si jamais) accéder aux ivars dans les superclasses.Si vous êtes un puriste, vous ne devriez même pas accéder directement aux ivars dans la même classe sauf dans les accesseurs, init
, et dealloc
(et les deux derniers sont sujets à débat).
Merci pour la réponse. C'est très déroutant en effet, j'essaie actuellement de le comprendre en lisant le livre "le langage de programmation C objectif" disponible chez Apple mais les variables publiques doivent être évitées selon eux. Quelle serait la bonne façon de le faire alors? Un contrôleur de vue est chargé d'obtenir l'entrée de l'utilisateur, puis de déterminer un nombre à affecter à une variable entière. Ensuite, un autre viewcontroller est affiché et ce viewcontroller recherche ce numéro. Comment puis-je passer une valeur simple créée dans le fichier 1 .m à un autre fichier .m? Il se sent si simple pourtant si sacrément difficile – BittenApple
(voir la mise à jour de la réponse) – shosti
Merci beaucoup d'avoir répondu à ma question. Je ne sais pas pourquoi vous avez pris tant d'efforts pour écrire une explication aussi détaillée. Les gens comme vous qui sont prêts à aider sont très difficiles à rencontrer de nos jours. Merci une fois de plus. – BittenApple