web-dev-qa-db-fra.com

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 également conservée dans le fichier .m. Qu'est-ce que ça veut dire? Quelle est la différence entre eux?

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

80
Rajkanth

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

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 "catégorie privée" (le nom propre d'une catégorie sans nom n'est pas "catégorie privée", c'est "l'extension de classe") .m empêche le compilateur d'avertir que les méthodes sont définies. Cependant, parce que le @interface dans le fichier .m est une catégorie dans laquelle vous ne pouvez pas définir d'ivars.

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

  • ivars peut être déclaré dans une extension de classe (et pourrait toujours l'être - la réponse était incorrecte)
  • @synthesize n'est pas requis
  • ivars peut maintenant être déclaré entre accolades en haut de @implementation:

c'est,

@implementation { 
     id _ivarInImplmentation;
}
//methods
@end
62
Benedict Cohen

Le concept est que vous pouvez rendre votre projet beaucoup plus propre si vous limitez le .h aux interfaces publiques de votre classe, puis placez des détails d'implémentation privés 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 propriétés et méthodes de variables peuvent être accessibles 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 privés, des propriétés et des méthodes. Donc, tout ce que vous déclarez ici n'est pas accessible depuis l'extérieur de cette classe. En général, vous souhaitez déclarer tous les ivars, propriétés et méthodes par défaut comme privés

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

@interface Jain()
    {
        NSString *_name;
    }

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

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 ayant un comportement légèrement différent. Vous pouvez l'utiliser dans un modèle d'usine

0
Enrico Cupellini