Síntesis de properties automáticas (@property) y inheritance

Con XCode 5.1, aparece una nueva advertencia. Me hizo comprender, evidentemente, que estaba haciendo algo mal.

La idea era tener un object (un model) y es una versión mutable que henetworkinga de la class original. Entonces, la idea es abrir una propiedad que readonly era readwrite

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

Esas deben estar en files separados (como dos classs 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 adecuada para hacer algo así, si es posible. si es necesario para escribir accesores y evitar el uso de auto síntesis, etc. Solo por favor, sea preciso y respalde su respuesta con documentation 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, el clang no intentará usar la autosíntesis

Editar:

Si no desea usar la encapsulación y, por otro motivo, necesita acceder al ivar de la class padre, entonces necesita hacer un poco más de esfuerzo:

Primero, el file 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 file .m, estoy implementando el método printVar y también agregando una extensión de class para decirle al clang para crear el configurador:

 // 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 esa manera, el _nombre ivar en el padre se escribe realmente usando el padre establecedor y puede acceder a él.