objective c - herencia de propiedades: la síntesis automática de propiedades no sintetizará propiedades
objective-c inheritance (1)
Debe declarar la propiedad como lectura-escritura en la clase propietaria ( A
) y luego volver a declarar en la subclase ( B
) para que el compilador se dé cuenta de que desea usarla allí. Entonces, A
aloja el método de acceso y B
usa. En general, no desea que B
cree otro método de acceso, por lo que puede usar @dynamic
para decirle al compilador que la superclase (técnicamente, solo otra clase) proporcionará la implementación.
Tenga en cuenta que también puede declarar una categoría (no una extensión) en A
, en B
.m, que declara explícitamente el método de acceso (sin usar una propiedad, solo un método), ya que eso es lo que realmente le interesa (no realmente desea cualquiera de las otras cosas que especifica una propiedad y realmente no desea la sobrecarga de mantenimiento de garantizar que los atributos de propiedad coincidan en la superclase y la subclase) ...
Resumen :
Esta pregunta es sobre la herencia de propiedades en combinación con diferentes accesos de lectura / escritura desde dentro y desde fuera de las clases que heredan la propiedad entre sí.
Detalles :
Tengo una clase A
y otra clase B
, que se hereda de A
Existe la propiedad someProperty
propiedad declarada en A
Quiero que la propiedad sea de solo lectura desde fuera de estas clases y de lectura / escritura desde dentro.
Con solo una clase, esto es muy simple: declara la propiedad en .h
como de solo lectura y la declara nuevamente como readwrite en la .m dentro de una categoría. Hecho.
Pero con las dos clases, una derivada de la otra, recibo la siguiente advertencia del compilador en B
:
La síntesis automática de propiedades no sintetizará la propiedad ''someProperty'' porque es ''readwrite'' pero se sintetizará ''readonly'' a través de otra propiedad
Aquí está el código:
Ah
#import <Foundation/Foundation.h>
@interface A : NSObject
// This property shall be readonly from outside, but read/write from subclasses
@property (readonly) SInt32 someProperty;
@end
A.m:
#import "A.h"
@implementation A
@end
Bh:
#import <Foundation/Foundation.h>
#import "A.h"
@interface B : A
@end
Bm:
#import "B.h"
@interface B ()
// compiler warning in the following property declaration:
// /Users/.../B.m:12:41: Auto property synthesis will not synthesize property
// ''someProperty'' because it is ''readwrite'' but it will be synthesized
// ''readonly'' via another property
@property (readwrite) SInt32 someProperty;
@end
@implementation B
@end
¿Por qué aparece esta advertencia y cómo debo estructurar mi código para evitarlo?