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
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 requisivars
peut maintenant être déclaré 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 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
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