iVar n'est pas reconnu si je déclare mon propre getter & setter

Dupliquer possible:
propriété ne fonctionne pas avec getter ET setter

c'est le problème auquel je suis confronté: j'utilise iOS 6. Je déclare une propriété dans le file d'en-tête:

@property (nonatomic) CGFloat scale; 

Ensuite, dans l'implémentation, je crée mon propre getter / setter comme ceci:

 #define DEFAULT_SCALE 0.90 - (void)setScale:(CGFloat)scale { if(_scale != scale) { _scale = scale; [self setNeedsDisplay]; } } - (CGFloat) scale { if(!_scale) { return DEFAULT_SCALE; } else { return _scale; } } 

le problème est que _scale n'est pas reconnu par le compilateur. J'obtiens une erreur "Utilisation de l'identificateur non déclaré '_scale" Si je supprime le getter ou le setter, alors ça marche bien, mais je ne peux pas garder les deux .Si je le fais, je dois append @synthesize scale = _scale pour éviter le Une erreur peut-elle expliquer pourquoi?

Merci

Vous devez déclarer la variable d'instance dans l' @interface si vous utilisez votre propre setter / getter:

 @interface MyClass : NSObject { CGFloat _scale; } ... @end 

EDIT (après la question OP):

Votre implémentation particulière fait certainement une différence (ce ne sont pas de simples methods getter / setter car elles font quelque chose comme effet secondaire). Cependant, je pense que c'est toujours une bonne idée de déclarer vos variables et absolument nécessaire si vous voulez cibler OSX 32 bits, car le moteur d'exécution ne supporte pas les variables d'instance auto-déclarées.

Si vous fournissez une implémentation complète (getter et setter) le compilateur suppose que vous n'aurez pas besoin d'un ivar donc si vous en voulez un, vous devez en créer un vous-même. Soit vous faites un ivar, soit laissez @synthesize le faire pour vous. Le résultat final est le même (un ivar est créé); la seule différence est dans le premier cas, vous pouvez l'appeler comme vous voulez.

Légèrement différent mais lié j'ai souvent un

 @property (nonatomic,readonly) SomeThing* something; 

et fournir une méthode

 - (Something*) something { return xxxxxx; } 

pour les cas où vous avez une méthode qui returnne quelque chose mais avoir une propriété est un raccourci.