ios objective-c properties warnings xcode5.1

ios - Síntesis de propiedad automática(@property) y herencia



objective-c properties (1)

Con XCode 5.1, aparece una nueva advertencia. Me hizo entender -obviamente- que estaba haciendo algo mal.

La idea era tener un objeto (un modelo) y su versión mutable que hereda de la clase original. Entonces la idea es abrir una propiedad que fue de readonly para readwrite

@interface Car : NSObject @property (strong, readonly) NSString *name; @end @interface MutableCar : Car @property (strong, readwrite) NSString *name; @end

Esas necesidades deben estar en archivos separados (como dos clases normales).

Y da esta advertencia:

Auto property synthesis will not synthesize property ''name'' because it is ''readwrite'' but it will be synthesized ''readonly'' via another property

Entonces me gustaría saber cuál es la solución correcta para hacer algo así, si es posible. si es necesario para escribir accesos y evitar el uso de auto síntesis, etc. Solo por favor sea preciso y respalde su respuesta con documentación o lo que sea.


Sugeriría sintetizar explícitamente la propiedad en su implementación de MutableCar. Como en:

@implementation MutableCar @synthesize name; @end

De esa forma, clang no intentará usar autosynthesis

Editar:

Si no desea utilizar la encapsulación y por algún otro motivo necesita acceder al ivar desde la clase principal, deberá esforzarse un poco más:

Primero, el archivo Car .h sigue siendo el mismo (agregué un método printVar para imprimir el ivar y la propiedad):

@interface Car : NSObject - (void)printVar; @property (strong, readonly) NSString *name; @end

Ahora en el archivo .m, estoy implementando el método printVar y también agregando una extensión de clase para decirle a clang que cree el setter:

// Private class extension, causes setName: to be created but not exposed. @interface Car () @property (strong, readwrite) NSString *name; @end @implementation Car - (void)printVar { NSLog(@"<Car> Hello %@, ivar: %@", self.name, _name); } @end

Ahora puedes crear tu MutableCar.h como antes:

@interface MutableCar : Car @property (strong, readwrite) NSString *name; @end

y tu MutableCar.m debería verse así:

@implementation MutableCar @dynamic name; - (void)printVar { [super printVar]; NSLog(@"<MutableCar> Hello %@", self.name); } @end

De esta forma, el _name ivar del padre se escribe con el sistema principal y se puede acceder a él.