Override @le setter de la propriété et de la boucle infinie
Il est de Classe A avec:
@interface ClassA : NSObject {
}
@property (nonatomic, assign) id prop1;
@end
@implementation
@synthesize prop1;
@end
puis j'ai sous-classe
@interface ClassB : ClassA {
}
@end
@implementation
- (id)init {
self = [super init];
if (self) {
}
return self;
}
//This is infinite loop
- (void) setProp1:(id)aProp
{
self.prop1 = aProp;
}
@end
et c'est une boucle infinie, car setProp1 de ClassB appels [ClassB setProp1:val] de l'intérieur ClassB.
J'ai déjà essayé d'appeler [super setProp1] mais ce
Comment faire pour remplacer @biens et d'attribuer de la valeur à l'intérieur écrasé setter ? Et supposons que je ne peux pas modifier ClassA.
- “J'ai déjà essayé d'appeler [super setProp1] mais ce”...? Quel était le problème?
super
est correct ici. - super le changement de la valeur en super seulement. auto.prop1 est nul et super.prop1 ont de la valeur. l'auto->prop1 faire l'affaire (comme Sherm proposer)
- auto.prop1 et super.prop1 ne doit certainement pas être le retour des valeurs différentes. Êtes-vous en surchargeant la méthode de lecture trop?
- oui je fais et il est de retour "aProp" à partir de ce setter.
- Ne devrait pas l'implémentation de la superclasse de la lecture le faire déjà?
Vous devez vous connecter pour publier un commentaire.
Suffit d'attribuer à la variable d'instance directement, sans l'aide de la syntaxe à point pour appeler le setter:
Ce genre de pose la question si. Tout cela accesseur ne est exactement ce que le parent aurait fait - quel est donc le point de l'annulation de la la société mère à tous?
self->
partie à moins d'utiliser GCC 4.2.Avec XCode 4.5+ et LLVM 4.1 il n'est pas nécessaire de @synthétiser, vous obtiendrez un _prop1 de référence.
Suffira.
Vous ne devriez pas utiliser "auto" à l'intérieur de l'incubateur depuis que crée l'appel récursif.
Aussi, vous devriez assurez-vous que vous n'êtes pas en attribuant le même objet, de retenir le nouvel objet et la libération de l'ancien objet avant leur attribution.
Et vous devez redéfinir le setter nom, comme suggéré ci-dessus:
retain
propriété, l'OP est un exempleassign
de la propriété.Une autre solution consiste à définir la synthétisés variable à un autre nom, comme ceci:
Et puis de se référer à elle comme
_selectedQuestion
. Cela empêche accidentellement écrit selectedQuestion quand vous pensez de soi.selectedQuestion.Toutefois, Apple vous déconseillons l'utilisation de soulignement. Vous pouvez utiliser un autre nom, mais @Sherm de la méthode est la meilleure, à mon humble avis.
Simplement
@synthesize
la propriété désirée dans votre sous-classe, alors vous pouvez l'utiliser comme nom pour accéder à la propriété directement:Classe principale de l'interface:
Sous-classe de l'interface:
Sous-classe de mise en œuvre: