@property et le reste
LeLaid
Membre
Salut à tous
J'ai encore un souci de débutant à vous soumettre: 8--)
J'ai une classe qui a deux variables. J'ai ajouté l'instruction @property pour que les setter et getter soient automatiquement construits.
Dans l'implémentation j'initialise comme ceci:
@implementation PBMandelbrotView
@synthesize Largeur;
A la compilation j'ai un warning au niveau de
warning: invalid receiver type 'NSUInteger' ???
Je comprends pas pourquoi??? >:(
J'ai encore un souci de débutant à vous soumettre: 8--)
J'ai une classe qui a deux variables. J'ai ajouté l'instruction @property pour que les setter et getter soient automatiquement construits.
@interface PBMaClass : NSView <br />{ <br /> NSUInteger Largeur;<br /> NSUInteger Longueur;<br />}<br /><br />@property (readwrite) NSUInteger Largeur;<br />@property (readwrite) NSUInteger Longueur;<br /><br />@end
Dans l'implémentation j'initialise comme ceci:
@implementation PBMandelbrotView
@synthesize Largeur;
@synthesize Longueur;<br /><br />- (id) init<br />{<br /> if (self = [super init])<br /> {<br /> [Largeur setLargeur: 300];<br /> [Longueur setLongueur: 400]; <br /> }<br /> return(self);<br />}<br />@end
A la compilation j'ai un warning au niveau de
[Largeur setLargeur: 300];<br />[Longueur setLongueur: 400];
warning: invalid receiver type 'NSUInteger' ???
Je comprends pas pourquoi??? >:(
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Je dois écrire [self setLongueur: 400]...
PS. Des bouquins j'en ai achetés 3....
Ca ne m'enpêche pas d'avoir des petites question que je me permet de poser dans la section débutant (qui, si je comprends bien le Français, est faite pour ça).
Merci tout de même pour ton aide ;D
Ceci dit, si c'est juste pour initialiser tes NSUInteger à l'intérieur même de la classe, autant le faire directement...
J'ai lu qu'il fallait éviter d'alloué une valeur de cette façon....
Ici, l'@interface (partie qui déclare notamment tes variables d'instance) est intimement liée à son @implementation.
Donc, sans trop casser la paradigme objet, tu peux directement utiliser tes variables dans ta classe sans passer par les getter/setters...
Ce qui est important, c'est effectivement de séparer interface d'une classe de l'implémentation d'une autre classe. Là , l'utilisation des setter/getters devient obligatoire.
Evidement s'il me venait à l'idée de changer le nom d'une de mes iVars je devrais de toute façon modifier le reste (@property et le reste...).
Ok, merci
Pascal
La méthode setLargeur est une méthode de la classe, et non de la variable largeur.
Il faut mettre soit [self setLargeur:200]; soit self.largeur=200; soit largeur=200;
Pour un NSUinteger, il n'y a aucune allocation dynamique, aucun "alloc" si tu préfères.
La mémoire nécessaire est prévue et réservée à l'avance à la création de l'instance.
Le premier appel le getter de largeur tandis que le second affecte directement largeur.
Je le dit juste parce que ça ma étonné venant du monde Java.
Si il n'y a pas de traitement spécial dans le setter, c'est-à -dire si on a simplement mis @synthesize NSUInteger largeur; il n'y a aucune différence car il s'agit ici d'un type simple (pas de retain/release par en dessous)
Après cela, si on a mis un attribut readonly le setter n'existe pas, ou si on se fait son propre setter, c'est le code que l'on y a installé qui est exécuté.
Autre remarque, avec Cocoa, des coordonnées, des longueurs, des largeurs sont en général des CGFloat. Mais bon, on peut avoir besoin exceptionnellement d'utiliser des entiers.
Fonctionnellement non par contre il est peut être important de signaler qu'au niveau performances c'est le jour et la nuit.
Tu pourrais précisez s'il te plais? Ca m'intéresse.
Ah bon? Et pourquoi on utilise pas simplement des float et int de base?
Un million d'affectations avec un setter ==> 0.030 secondes
Un million d'affectations avec une fonction static inline ==> 0.023 secondes
Un million d'affectations simples ==> 0.020 secondes
Parce que les fonctions classiques de l'appKit sont en flottants (CGFloat maintenant, mais tu peux mettre float), pas en entier (NSInteger maintenant, mais tu peux mettre int).
Merci Philippe.