objective-c ios override subclass

objective c - Anular @property setter y bucle infinito



objective-c ios (5)

Con XCode 4.5+ y LLVM 4.1 no hay necesidad de @synthesize, obtendrá un _prop1 para referirse a.

- (void) setProp1:(id)aProp { _prop1 = aProp; }

Funcionará bien.

Hay clase A con:

@interface ClassA : NSObject { } @property (nonatomic, assign) id prop1; @end @implementation @synthesize prop1; @end

entonces tengo la subclase

@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

y este es un ciclo infinito porque setProp1 de ClassB llama [ClassB setProp1: val] desde ClassB.

Ya he intentado llamar a [super setProp1] pero esto

¿Cómo sobrescribir @property y asignar valor dentro del setter sobreescrito? Y supongamos que no puedo modificar ClassA.


No debe usar "self" dentro del setter ya que eso crea la llamada recursiva.

Además, debe verificar para asegurarse de que no está asignando el mismo objeto, retener el nuevo objeto y liberar el objeto anterior antes de la asignación.

Y debe redefinir el nombre del colocador, como se sugirió anteriormente:

@synthesize prop1 = prop1_; ... - (void) setProp1:(id)aProp { if (prop1_ != aProp) { [aProp retain]; [prop1_ release]; prop1_ = aProp; } }


Otra alternativa es establecer la variable sintetizada a otro nombre así:

@synthesize selectedQuestion = _selectedQuestion;

Y luego refiérase a él como _selectedQuestion . Esto evita escribir accidentalmente selectedQuestion cuando te referías a self.selectedQuestion.

Sin embargo, Apple recomienda no usar guiones bajos. Puedes usar otro nombre, pero el método de @ Sherm es el mejor, ¡hola!


Simplemente @synthesize la propiedad deseada en su subclase, luego puede usarla como nombre para acceder directamente a la propiedad:

Interfaz de clase principal:

@interface AClass : NSObject @property (nonatomic, assign) id<someProtocol> delegate; @end

Interfaz de subclase:

@interface BCLass : AClass @end

Implementación de la subclase:

@implementation BCLass @synthesize delegate = _delegate; - (void)setDelegate:(id<someProtocol>)d{ _delegate = d; } @end


Simplemente asigne directamente a la variable de instancia, sin usar la sintaxis de punto para llamar al colocador:

- (void) setProp1:(id)aProp { self->prop1 = aProp; }

Sin embargo, eso plantea la pregunta. Todo lo que hace este descriptor de acceso es exactamente lo que el padre habría hecho, entonces, ¿para qué sirve anular al padre?