Question

Je suis en train de modifier l'application exemple QuartzDemo et que vous souhaitez faire ensemble et lire les valeurs des variables de type entier dans d'autres classes qui sont déjà inclus.

Par exemple, dans MainViewController.m je veux définir une valeur numérique (numéros simples de 1-100) à une variable qui est ensuite va être appelé (lecture) dans le fichier QuartzImages.m.

La question est de savoir comment définir correctement la variable, ensemble et l'accès (lecture) 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 l'aide à tous:)

Merci, celui qui et où que vous soyez, personne qui me sortir de cette boucle de googler sans fin.

Était-ce utile?

La solution

Si vous avez une variable, il y a deux façons de lire et définir les propriétés (qui sont généralement une combinaison d'un Ivar et les méthodes accesseurs). 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 livre de Hillegass. Il explique Cocoa et Objective-C en détail.

EDIT: Je pense que la confusion est ici avec la terminologie. En Objective-C, la plupart des objets ont des variables d'instance (de Ivars), qui stockent des données réellement. Cependant, en général, vous voulez éviter d'accéder directement 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 est d'accroître la flexibilité - si j'ai un Person de classe qui a une, par exemple age variable d'instance, je souhaite modifier ma mise en œuvre à l'avenir pour déterminer de façon dynamique l'âge. Si d'autres classes comptent sur la age variable d'instance, ils casseront quand la mise en œuvre change.

La façon de contourner ce problème est de accesseurs d'utilisation, qui sont des méthodes qui contrôlent l'accès à un Ivar. En Objective-C, « getters » obtenir la variable, et sont généralement nommés la même chose que la variable (donc dans l'exemple de Person, le getter serait -(int)age) et « setters » la variable (il serait nommé -(void)setAge:(int)theAge). Si vous utilisez accesseurs, vous pouvez librement modifier votre mise en œuvre à l'avenir, même se débarrasser de l'Ivar complètement si nécessaire, sans les classes qui dépendent de rupture.

Dans Objective-C, la combinaison d'un Ivar et accesseurs est souvent appelé une « propriété » (bien qu'il ne doit pas nécessairement avoir à ê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 Ivars dans d'autres classes - ils sont les 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 à Ivars dans d'autres classes. Vous devriez rarement (voire jamais) Ivars d'accès à superclasse. Si vous êtes un puriste, vous ne devriez pas même Ivars accès directement dans la même classe, sauf dans accesseurs, init et dealloc (et les deux derniers font l'objet d'un débat).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top