Pregunta Diferencia entre definición de interfaz @ en archivo .h y .m


Normalmente usamos

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

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

Pero en algún código, 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 brinde algunas palabras sobre getters y setters para el archivo de interfaz que se define en el archivo .m ...

Gracias por adelantado


76
2017-10-19 09:59


origen


Respuestas:


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

Person.h:

@interface Person
{
    NSString *_name;
}

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

Person.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 propio de una categoría sin nombre no es 'categoría privada', es 'extensión de clase') .m impide que el compilador advierta que los métodos están definidos. Sin embargo, porque el @interface en el archivo .m es una categoría en la que no puede definir ivars.

Actualización del 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 fue incorrecta)
  • @synthesize no es requerido
  • ivars ahora se puede declarar entre llaves en la parte superior de @implementation:

es decir,

@implementation { 
     id _ivarInImplmentation;
}
//methods
@end

59
2017-10-19 10:35



El concepto es que puedes hacer tu proyecto mucho más limpio si   limite la .h a las interfaces públicas de su clase, y luego ponga   detalles privados de implementación en esta extensión de clase.

cuando declaras métodos o propiedades variables en el archivo ABC.h,   significa que estas propiedades de variables y métodos se pueden acceder 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. Entonces, no se puede acceder a nada de lo que declaras aquí desde afuera   esta clase. En general, quiere declarar todos los ivars, propiedades y   métodos por defecto como privado

Simplemente diga cuándo declara métodos o propiedades variables en ABC.m   archivo, significa que estas propiedades de variables y métodos no pueden ser   acceso fuera de la clase

@interface Jain()
    {
        NSString *_name;
    }

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

7
2018-04-01 16:50



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


0
2017-12-09 18:19