85 votes

Différence entre la définition de @interface dans les fichiers .h et .m

Normalement, nous utilisons

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

dans le fichier .h et dans le fichier .m nous synthétisons les propriétés des variables déclarées dans le fichier .h.

Mais dans certains codes, cette méthode @interface.....@end est conservée dans le fichier .m également. Qu'est-ce que cela signifie ? Quelle est la différence entre les deux ?

Donnez également quelques mots sur les getters et setters pour le fichier d'interface qui est défini dans le fichier .m...

Merci d'avance

64voto

Benedict Cohen Points 6997

Il est courant d'ajouter un @interface qui définit une catégorie contenant des méthodes privées :

Personne.h :

@interface Person
{
    NSString *_name;
}

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

Personne.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 "catégorie privée" (le nom approprié pour une catégorie sans nom n'est pas "catégorie privée", mais "extension de classe") .m empêche le compilateur de signaler que les méthodes sont définies. Cependant, étant donné que l'extension @interface dans le fichier .m est une catégorie, vous ne pouvez pas y définir des ivars.

Mise à jour du 6 août 12 : Objective-C a évolué depuis la rédaction de cette réponse :

  • ivars peut être déclarée dans une extension de classe (et a toujours pu l'être - la réponse était incorrecte)
  • @synthesize n'est pas nécessaire
  • ivars peuvent désormais être déclarés entre accolades au début de la section @implementation :

c'est-à-dire,

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

11voto

Shubham JAin Points 440

L'idée est que vous pouvez rendre votre projet beaucoup plus propre si vous si vous limitez le .h à l'interfaçage public. les détails de l'implémentation privée dans cette extension de classe.

Lorsque vous déclarez des méthodes ou des propriétés de variables dans le fichier ABC.h, cela signifie que ces méthodes ou propriétés sont des variables. signifie que ces variables, propriétés et méthodes peuvent être accédées en dehors de la classe

@interface Jain:NSObject
{
    NSString *_name;
}

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

@Interface vous permet de déclarer des ivars, des propriétés et des méthodes. Ainsi, tout ce que vous déclarez ici n'est pas accessible depuis l'extérieur de de cette classe. En général, il est préférable de déclarer tous les ivars, propriétés et par défaut comme étant privées

Il suffit de déclarer des méthodes ou des propriétés de variables dans le fichier ABC.m cela signifie que ces variables, propriétés et méthodes ne peuvent pas être accessibles en dehors de la classe

@interface Jain()
    {
        NSString *_name;
    }

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

0voto

Vous pouvez même créer d'autres classes dans le fichier .m, par exemple d'autres petites classes qui héritent de la classe déclarée dans le fichier .h mais dont le comportement est légèrement différent. Vous pouvez utiliser cette méthode dans le cadre d'un modèle d'usine

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X