2010-05-21 3 views
0

Je suis en train de modifier l'exemple d'application QuartzDemo et je souhaite définir et lire des valeurs de variables de types entiers dans d'autres classes déjà incluses. Par exemple, dans MainViewController.m Je veux définir une valeur numérique (nombres simples de 1-100) à une variable qui va ensuite être appelée (lire) dans le fichier QuartzImages.m.comment définir et accéder aux valeurs variables d'un autre classess

La question est comment définir correctement la variable, définir et accéder (lire) la valeur.

Je suis un débutant avec Obj C et SDK iPhone en général et avoir une certaine expérience avec Delphi et VB, mais cela ne suffit pas du tout :) Merci

, celui qui et où que vous soyez, personne qui Sors-moi de cette boucle de googling sans fin.

Répondre

1

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).

+0

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

+0

(voir la mise à jour de la réponse) – shosti

+0

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

Questions connexes