Diferencia entre la definición de @interface en el archivo .hy .m

81

Normalmente usamos

@interface interface_name : parent_class <delegates>
{
......
}
@end 

en el archivo .h y en el archivo .m sintetizamos las propiedades de las variables declaradas en el archivo .h.

Pero en algunos códigos, este método @interface ..... @ end también se guarda en el archivo .m. Qué significa eso? ¿Cuál es la diferencia entre ellos?

También dé algunas palabras sobre captadores y definidores para el archivo de interfaz que se define en el archivo .m ...

Gracias por adelantado

bgolson
fuente

Respuestas:

63

Es común poner un adicional @interfaceque defina una categoría que contiene métodos privados:

Persona.h:

@interface Person
{
    NSString *_name;
}

@property(readwrite, copy) NSString *name;
-(NSString*)makeSmallTalkWith:(Person*)person;
@end

Persona.m:

@interface Person () //Not specifying a name for the category makes compiler checks that these methods are implemented.

-(void)startThinkOfWhatToHaveForDinner;
@end


@implementation Person

@synthesize name = _name;

-(NSString*)makeSmallTalkWith:(Person*)person
{
    [self startThinkOfWhatToHaveForDinner];
    return @"How's your day?";
}


-(void)startThinkOfWhatToHaveForDinner
{

}

@end

La 'categoría privada' (el nombre adecuado para una categoría sin nombre no es 'categoría privada', es 'extensión de clase') .m evita que el compilador advierta que los métodos están definidos. Sin embargo, debido @interfacea que el archivo .m es una categoría, no puede definir ivars en él.

Actualización 6 de agosto de 2012: Objective-C ha evolucionado desde que se escribió esta respuesta:

  • ivars se puede declarar en una extensión de clase (y siempre podría ser, la respuesta era incorrecta)
  • @synthesize no es requerido
  • ivarsahora se puede declarar entre llaves en la parte superior de @implementation:

es decir,

@implementation { 
     id _ivarInImplmentation;
}
//methods
@end
Benedict Cohen
fuente
4
Pequeña nota al margen, en realidad no ponga nada entre paréntesis cuando declare la interfaz privada. De lo contrario, solo crea una categoría y no quieres eso. @interface Person ()Será suficiente.
Itai Ferber
Gracias itaiferber, no me había dado cuenta. Actualicé mi respuesta.
Benedict Cohen
4
Si la gente está interesada en saber más sobre las categorías ... esta página me fue muy útil.
Tim
1
Si no hay nada entre corchetes, entonces esto se llama realmente class extensionno uncategory
Paul.s
5
@ giant91 Esta respuesta es bastante antigua y el compilador ha mejorado mucho desde que se escribió inicialmente. El compilador ya no necesita una declaración para un método si el cuerpo del método es 'visible'. Esto significa que las continuaciones de clase ( @interface className ()) generalmente ahora solo contendrán @propertys privados .
Benedict Cohen
10

El concepto es que puede hacer que su proyecto sea mucho más limpio si limita el .h a las interfaces públicas de su clase, y luego coloca los detalles de implementación privada en esta extensión de clase.

cuando declara métodos o propiedades variables en el archivo ABC.h, significa que se puede acceder a estas propiedades y métodos de variables fuera de la clase

@interface Jain:NSObject
{
    NSString *_name;
}

@property(readwrite, copy) NSString *name;
-(NSString*)makeSmallTalkWith:(Person*)jain;
@end

@Interface le permite declarar ivars, propiedades y métodos privados. Por lo tanto, no se puede acceder a todo lo que declare aquí desde fuera de esta clase. En general, desea declarar todos los ivars, propiedades y métodos de forma predeterminada como privados

Simplemente diga cuando declara métodos o propiedades de variables en el archivo ABC.m, significa que no se puede acceder a estas propiedades y métodos de variables fuera de la clase

@interface Jain()
    {
        NSString *_name;
    }

    @property(readwrite, copy) NSString *name;
    -(NSString*)makeSmallTalkWith:(Person*)jain;
    @end
Shubham JAin
fuente
0

incluso puede crear otras clases en el archivo .m, por ejemplo, otras clases pequeñas que heredan de la clase declarada en el archivo .h pero que tienen un comportamiento ligeramente diferente. Podrías usar esto en un patrón de fábrica

Enrico Cupellini
fuente