Comportement étrange Xcode surcharge Getters/Setters

Salut, je viens vers vous pour voir si vous aussi vous avez ce "problème".


 


J'utilise Xcode 4.6.3 avec ARC, et Xcode est sensé déclarer automatiquement les @synthesize des propriétés de ma classe.


 


Prenons ma classe:



#import <Cocoa/Cocoa.h>

typedef enum {
GAArtworkViewPlaceholderNone,
GAArtworkViewPlaceholderSong,
GAArtworkViewPlaceholderAlbum,
GAArtworkViewPlaceholderArtist,
GAArtworkViewPlaceholderPlaylist,
GAArtworkViewPlaceholderPodcast
} GAArtworkViewPlaceholder;

@interface GAArtworkView : NSView

@property (nonatomic, strong) NSImage *image;
@property (nonatomic, assign) GAArtworkViewPlaceholder placeholder;

@end

ensuite si je souhaite surcharger les getter et setter de la proporiété image



- (void)setImage:(NSImage *)newImage{
if (_image != newImage) {
_image = newImage;
[self setNeedsDisplay:YES];
}
}


- (NSImage *)image{

if (_image) return _image;

switch (self.placeholder) {
case GAArtworkViewPlaceholderNone:
return [NSImage imageNamed:@placeholderNone];
break;
case GAArtworkViewPlaceholderSong:
return [NSImage imageNamed:@placeholderSong];
break;
case GAArtworkViewPlaceholderAlbum:
return [NSImage imageNamed:@placeholderAlbum];
break;
case GAArtworkViewPlaceholderArtist:
return [NSImage imageNamed:@placeholderArtist];
break;
case GAArtworkViewPlaceholderPlaylist:
return [NSImage imageNamed:@placeholderPlaylist];
break;
case GAArtworkViewPlaceholderPodcast:
return [NSImage imageNamed:@placeholderPodcast];
break;
default:
break;
}

return nil;
}

hors xCode me génère une erreur "Use of undeclared identifier '_image'".


 


si je surcharge soit le getter, soit le setter uniquement (pas les deux) ça fonctionne.


 


Je règle ce problème en indiquant manuellement



@synthesize image = _image;

Voilà , je me demandais, si c'est le comportement normal (j'utilise ARC depuis peux) ou bien si mon xCode délire un peu. Normalement si xCode génère automatiquement les @synthesize, je n'ai pas à  le faire moi-même.


 


Merci.


Réponses

  • C'est normal. Quand tu implémentes toi même un getter ET un setter, tu dois utiliser @synthesize.


  • igregigreg Membre

    ok merci, je n'avais même pas fait attention  ;D


  • CéroceCéroce Membre, Modérateur

    ... ou déclarer la variable d'instance _image.


  • AliGatorAliGator Membre, Modérateur
    Et c'est bien normal, car si tu avais besoin d'une propriété qui n'était pas stockée dans une variable d'instance (par exemple qui ferait une requête CoreData sous le capot, ou qui irait lire une valeur dans les NSUserDefaults, ou qui calculerait sa valeur en fonction d'autres propriétés...) ça servirait à  rien qu'il te génère la variable d'instance pour rien.
    Donc logique que quand tu prends tout en charge et donc implémentes à  la fois le getter et le setter toi-même, il ne va pas générer la variable car c'est même pas dit que tu en aies besoin. Et si tu la veux, tu la déclare toi-même, ou tu utilises explicitement @synthesize pour qu'il te la génère.
  • Tiens je rajoute mon grain de sel ...


    (c'est parce qu'il n'y a plus de match de rugby en ce moment ; j'ai plein de temps disponible ;-)


     


    Le terme "surcharge" employé en titre de ce fil est impropre.


Connectez-vous ou Inscrivez-vous pour répondre.