2009-02-22 6 views
12

Si tiene Clase A con un "foo" instancia var que tiene un @ propiedad/directiva @ sintetizar y clase B hereda de la clase A, lo hace también necesitan @ property/@ sintetizar "foo"? La razón por la que pregunto es porque cuando trato de usar el "foo" de la Clase B, la clase que llama dice que "foo" no es algo de una unión estructurada o un miembro, lo que me hace creer que necesita ser sintetizado explícitamente.El uso de @ sintetizar/@ propiedad en la herencia de Objective-C

+0

Sí, como la interfaz es algo similar a: @interface ClassB: ClassA, necesita # import ClassA.h – Coocoo4Cocoa

+5

Está en el capítulo 8, ¿verdad? – willc2

+0

necesita importar en el archivo de encabezado de clase B - no reenviar declarar clase A e importar en el .m – gheese

Respuesta

10

No, no es así. Las propiedades sintetizadas se agregan automáticamente a la clase A y sus subclases.

+0

@Georg: ¡El voto a favor es mío, pero te aseguro que no fue intencional! Hice clic en la flecha hacia abajo por accidente, y ahora el voto es "demasiado viejo para cambiar". Si es tan amable de hacer una pequeña edición, con mucho gusto lo cambiaré a un upvote (que es lo que tenía la intención de hacer en primer lugar). –

+0

@ e.James: hecho. :) –

+4

Gracias. ¡Eso ha estado pesando en mi conciencia! :) –

1

Al heredar, no debería necesitar redeclarar ninguna propiedad o variable.

Tal vez si publica su archivo de encabezado ClassB o una parte de las personas, entonces puede identificar mejor su problema.

10

Si tiene Clase A con un "foo" instancia var que tiene un @ propiedad/@ sintetizar Directiva, y la clase B hereda de la clase A, lo hace también necesitan @ propiedad/@ sintetizar "foo"?

La razón que pido es porque cuando trato de usar "foo" de la clase B, la clase que llama dice ...

No, el compilador lo dice.

... que "foo" no es algo así como una unión estructurada o un miembro, lo que me hace pensar que debe ser sintetizado explícitamente.

Es. En la clase A.

El compilador le está dando la advertencia de que, ya que no sabe nada de la @property, que se debe a que haya declarado ni tampoco importado un encabezado que lo declara. Usted dice que la clase de cabecera A declara la propiedad, así cabecera de la clase A en la importación de implementación de la clase B, por lo que el compilador sabe acerca de la propiedad al compilar la clase B.

4

Sólo en caso de que esto ayude a alguien.

Me encontré con este problema y leí estas respuestas y todavía no podía acceder directamente a las variables de la superclase. Se declararon como propiedades y se sintetizaron en la superclase y yo importé el encabezado en mi subclase. Estuve atascado hasta que descubrí que necesitaba declarar las variables miembro en la sección @interface en la superclase, así como una propiedad de la superclase ...! p.ej.

@interface BuoyAnnotation : NSObject <MKAnnotation> 
{ 
    CLLocationCoordinate2D coordinate; 
    CLLocation* location; 
    int type; 

} 

@property (nonatomic, readonly) CLLocationCoordinate2D coordinate; 
@property (nonatomic, retain) CLLocation* location; 
@property (nonatomic, assign) int type; 
0

correcta, sólo declara una @property exterior de la declaración de variables entre llaves miembro típico y luego @synthesize la propiedad en el archivo .m. Me di cuenta de que en la clase secundaria has usado self.propertyName para hacer referencia a ella, pero en la clase padre puedes usar el nombre de la variable instantánea.

Cuestiones relacionadas