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

Normalement nous utilisons

@interface interface_name : parent_class  { ...... } @end 

méthode 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 les setters pour le fichier d’interface défini dans le fichier .m …

Merci d’avance

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

Person.h:

 @interface Person { NSSsortingng *_name; } @property(readwrite, copy) NSSsortingng *name; -(NSSsortingng*)makeSmallTalkWith:(Person*)person; @end 

Person.m:

 @interface Person () //Not specifying a name for the category makes comstackr checks that these methods are implemented. -(void)startThinkOfWhatToHaveForDinner; @end @implementation Person @synthesize name = _name; -(NSSsortingng*)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 “extension de classe”) .m empêche le compilateur d’avertir que les méthodes sont définies. Cependant, comme @interface du fichier .m est une catégorie, vous ne pouvez pas définir d’ivars.

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

  • ivars peuvent être déclarés dans une extension de classe (et pourraient toujours être – la réponse était incorrecte)
  • @synthesize n’est pas requirejs
  • ivars peuvent maintenant être déclarés entre accolades en haut de @implementation :

C’est,

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

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 les détails de l’implémentation privée dans cette extension de classe.

lorsque vous déclarez des méthodes de variable ou des propriétés dans un fichier ABC.h, cela signifie que ces propriétés et méthodes peuvent être accessibles en dehors de la classe

 @interface Jain:NSObject { NSSsortingng *_name; } @property(readwrite, copy) NSSsortingng *name; -(NSSsortingng*)makeSmallTalkWith:(Person*)jain; @end 

@Interface vous permet de déclarer des ivars, des propriétés et des méthodes privés. Donc, tout ce que vous déclarez ici n’est pas accessible en dehors de cette classe. En général, vous voulez déclarer tous les ivars, propriétés et méthodes par défaut comme privés

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

 @interface Jain() { NSSsortingng *_name; } @property(readwrite, copy) NSSsortingng *name; -(NSSsortingng*)makeSmallTalkWith:(Person*)jain; @end 

Vous pouvez même créer d’autres classes dans un 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 pourriez l’utiliser dans un modèle d’usine