Objective-C getter/ setter
J'essaie de travailler mon chemin à travers un Objectif-C-tutoriel. Dans le livre, il y a cet exemple:
@interface
{
int width;
int height;
XYPoint *origin;
}
@property int width, height;
J'ai pensé: "hé, il n'y a pas de getter/setter pour la XYPoint objet. Le code fonctionne bien." Maintenant, je vais peut-être répondre à ma propre question :).
Je pense que c'est parce que "l'origine" est un pointeur déjà, et ce qui se passe sous le capot avec "largeur" et "hauteur", c'est qu'il va te sera créé un pointeur vers eux..
Suis-je en droit, ou suis-je en train de parler BS 🙂 ??
J'ai tout simplement pas l'obtenir. voici les principaux:
#import "Rectangle.h"
#import "XYPoint.h"
int main (int argc, char *argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Rectangle *myRect = [[Rectangle alloc] init];
XYPoint *myPoint = [[XYPoint alloc] init];
[myPoint setX: 100 andY: 200];
[myRect setWidth: 5 andHeight: 8];
myRect.origin = myPoint;
NSLog (@"Rectangle w = %i, h = %i",
myRect.width, myRect.height);
NSLog (@"Origin at (%i, %i)",
myRect.origin.x, myRect.origin.y);
NSLog (@"Area = %i, Perimeter = %i",
[myRect area], [myRect perimeter]);
[myRect release];
[myPoint release];
[pool drain];
return 0;
}
Et voici l'objet Rectangle:
#import "Rectangle.h"
#import "XYPoint.h"
@implementation Rectangle
@synthesize width, height;
-(void) setWidth: (int) w andHeight: (int) h
{
width = w;
height = h;
}
- (void) setOrigin: (XYPoint *) pt
{
origin = pt;
}
-(int) area
{
return width * height;
}
-(int) perimeter
{
return (width + height) * 2;
}
-(XYPoint *) origin
{
return origin;
}
@end
Ce que je ne comprends pas est-ce la ligne principale: myRect.origin = myPoint;
je n'ai pas fait un setter pour elle..
BTW merci pour votre réponse rapide du
OriginalL'auteur pic-o-matic | 2010-04-11
Vous devez vous connecter pour publier un commentaire.
Il est à la fois un getter et un setter (collectivement, accesseurs) créé pour
origin
dans leRectangle
classe. Si vous avez un coup d'oeil dans la mise en œuvre deRectangle
, c'est de la lecture:et c'est le setter:
Et de l'Objective-C 2.0 appel:
est équivalent à:
Déclarant que les accesseurs et mutateurs à l'aide de
@property
(et puis de les mettre en œuvre à l'aide de@synthesize
) est le seul moyen de la déclaration et de la création d'accesseurs, et est là pour une commodité, si vous avez beaucoup de biens à déclarer dans l'interface de classe. CommeSchildmeijer
dit,@property int width
est équivalent à la déclaration de deux méthodes:En raison de la dynamique liée à la nature de l'Objective-C les appels de méthode, vous n'avez même pas ont de déclarer les getter et setter dans l'interface, même si elle est généralement la meilleure pratique de le faire si vous faites de la publicité comme accessibles à d'autres classes.
OriginalL'auteur Alex Rozanski
Vous pouvez penser de la déclaration de la propriété comme étant équivalent à la déclaration de deux méthodes d'accès. Ainsi
est équivalent à:
OriginalL'auteur Schildmeijer
Vous ne dites pas quel est le code de travail est, ou quelles sont vos attentes pour "travailler".
L'interface ci-dessus va créer de simples méthodes accesseur pour la largeur et la hauteur peut être appelé à partir d'autres objets comme
[object setWidth:1];
ouobject.width = 1;
- ces deux sont analogues.Origine est un autre type d'objet et est un pointeur, oui. Mais vous auriez encore envie de déclarer une propriété pour générer des méthodes accesseurs.
OriginalL'auteur Paul Lynch
Getters et les setters sont surtout utiles si vous avez besoin d'accéder à une variable d'instance d'une autre classe ou vous êtes en utilisant des liaisons à get/set. Donc, j'imagine que vous avez besoin de cette fonctionnalité pour la largeur et la hauteur, mais pas par l'origine. Notez que les getters/setters ne font pas de pointeurs sur des entiers comme vous le dites, peut-être la raison. Ints sont ints et des getters/setters ne changent pas.
OriginalL'auteur regulus6633
Si vous voulez faire de lecture seulement ou renommer les méthodes getter et setter
• readonly
• getter = newGetterName
• setter = new SetterName
exemple
OriginalL'auteur Mohamed Ali