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


Normalmente usamos

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

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

Pero en algún código, esta [email protected] método @end se mantiene en el .archivo m también. ¿Qué significa? ¿Cuál es la diferencia entre ellos?

También dar algunas palabras acerca de getters y setters para el archivo de interfaz que se define en .archivo m...

Gracias de antemano

Author: bgolson, 2010-10-19

3 answers

Es común poner un @interface adicional que define 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 propio 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, porque el @interface en el .el archivo m es una categoría en la que no puedes definir ivars.

Actualización del 6 de agosto del 12: Objective-C ha evolucionado desde esta respuesta fue escrita:

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

Es decir,

@implementation { 
     id _ivarInImplmentation;
}
//methods
@end
 61
Author: Benedict Cohen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-01 23:56:11

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

Cuando declara métodos o propiedades de variables en ABC.archivo h, It significa que estas variables propiedades y métodos pueden ser accedidos fuera de la clase

@interface Jain:NSObject
{
    NSString *_name;
}

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

@Interfaz le permite declarar ivars privados, propiedades y método. Así que cualquier cosa que declare aquí no se puede acceder desde el exterior esta clase. En general, desea declarar todos los ivars, propiedades y métodos por defecto como privados

Simplemente diga cuando declara métodos o propiedades variables en ABC.m archivo, Significa que estas variables propiedades 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
 8
Author: Shubham JAin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-01 16:50:55

Incluso puede crear otras clases en .archivo m, por ejemplo, otras clases pequeñas que heredan de la clase declarada en .archivo h pero con un ligero comportamiento diferente. Usted podría utilizar esto en un patrón de fábrica

 0
Author: Enrico Cupellini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-09 18:19:37