2011-11-19 2 views
2

Je ne comprends tout simplement pas pourquoi certains types déclarent les méthodes dans le fichier .m. Ces déclarations ne peuvent-elles pas aller dans le fichier .h? Voici ce que je vois la plupart du temps:Différence entre les méthodes déclarantes dans le fichier .h et dans le fichier .m spécifiant @interface et @end

//myClass.h 

#import <UIKit/UIKit.h> 

@interface myClass: UIViewController 
{ 

} 

@end 

et la mise en œuvre (.m) partie:

//myClass.m 

#import "myClass.h" 

@interface myClass 

//declare some methods here 

@end 

@implementation myClass 

//the actual implementation 

@end 

est-il une différence lorsque les méthodes sont déclarées de cette façon ?? De plus, les méthodes "@private" peuvent être déclarées dans myClass.h lui-même, n'est-ce pas?

+0

duplication possible de [Différence entre la définition @interface dans les fichiers .h et .m] (http://stackoverflow.com/questions/3967187/difference-between-interface-definition-in-h-and-m-file –

Répondre

4

Le code que vous avez publié à la fois ne compile pas et n'équivaut pas à déclarer des méthodes dans l'en-tête.

Le but de l'en-tête est de fournir un ensemble de déclarations que d'autres classes peuvent importer. Ils ne peuvent pas importer votre fichier d'implémentation, car cela créera des définitions en double. Comme l'a dit bbum, ce que vous voyez probablement est déclarations de méthodes privées dans le fichier d'implémentation. Ils ne sont pas destinés à être utilisés en dehors de la classe, ils sont donc déclarés dans le fichier d'implémentation. La fonction est appelée une extension de classe:

//MyClass.h 

#import <UIKit/UIKit.h> 

@interface MyClass: UIViewController 

// Declare methods that other classes should call here 

@end 

//MyClass.m 

#import "MyClass.h" 

@interface MyClass() // <--- NOTE THE PARENTHESES HERE 

// Declare methods that only this class should be using here 

@end 

@implementation MyClass 

// Define all your methods here 

@end 

Et non, vous ne pouvez pas déclarer « @private méthodes » dans l'en-tête, ou nulle part ailleurs. Il n'y a pas de telle chose dans Objective-C. Le spécificateur d'accès @private ne s'applique qu'aux variables.

+0

Ok. Merci de clarifier cela ... – Balaram

+0

Excellente réponse .. !! –

2
  • MyClass, et non myClass; les cours commencent par des majuscules.

Je serais surpris si ce code compile du tout. Si dans le .m, vous deviez dire:

@interface MyClass() 
@end 

Ensuite, ce serait une extension de classe, qui a été discuté à plusieurs reprises sur le SO. En l'état, vous déclarez un @interface conflictuel pour MyClass et le compilateur doit se plaindre.

+0

Eh bien, les classes ne DOIVENT PAS commencer par une limite - c'est une convention standard (qui devrait être observée) mais pas imposée par le compilateur ou tout autre composant Xcode/iOS. –

+2

Si vous ne commencez pas les cours avec une lettre majuscule et que vous deviez soumettre ce code comme un exemple de codage à n'importe quelle entreprise décente, ils ne vous engageraient probablement pas. Votre choix. ;) – bbum

5

Il s'agit de garder la séparation entre les interfaces publiques et privées à votre classe. Etre capable de déclarer des méthodes, des propriétés et des iVars dans le fichier d'implémentation est un indicateur clair de ce que vous pouvez faire et utiliser dans la classe et de ce qui peut être fait depuis l'extérieur de la classe.

Vous pouvez également redéfinir les propriétés. Par exemple:

dans .h

@property (readonly, copy) NSString *aString; 

dans .m

@property (readwrite, copy) NSString *aString; 

donc à partir de votre classe, vous pouvez traiter la propriété comme readwrite, mais à l'extérieur, la propriété est lecture seulement.

0

J'ai plusieurs fois déclaré des classes internes (différemment nommées de la classe principale) dans le fichier .m.Ce sont des classes utilisées par la classe principale que le .m contient (et qui a été déclaré dans le .h). De cette façon, la classe interne est "privée", plus, avec tout dans un fichier, il est plus facile à lire et à mettre à jour tout en travaillant sur l'implémentation de la classe principale.

+0

Suggestion; Lorsque vous déclarez des classes internes, ajoutez un suffixe comme '__' au nom de la classe. Cela rend tout à fait évident quand une classe interne est impliquée dans un backtrace, etc. J'utilise des classes internes tout le temps - très utile - et utilisera généralement une classe au lieu d'une structure aussi. – bbum

Questions connexes