Description Concise de la façon .h et .m fichiers interagir en objective-c?
J'ai juste commencé à apprendre objective-C et je suis vraiment confus comment l' .h et .m les fichiers d'interagir les uns avec les autres. Ce programme simple a 3 fichiers:
Fraction.h
#import <Foundation/NSObject.h>
@interface Fraction : NSObject {
int numerator;
int denominator;
}
- (void) print;
- (void) setNumerator: (int) n;
- (void) setDenominator: (int) d;
- (int) numerator;
- (int) denominator;
@end
Fraction.m
#import "Fraction.h"
#import <stdio.h>
@implementation Fraction
-(void) print { printf( "%i/%i", numerator, denominator ); }
-(void) setNumerator: (int) n { numerator = n; }
-(void) setDenominator: (int) d { denominator = d; }
-(int) denominator { return denominator; }
-(int) numerator { return numerator; }
@end
Principal.m
#import <stdio.h>
#import "Fraction.h"
int main(int argc, char *argv[]) {
Fraction *frac = [[Fraction alloc] init];
[frac setNumerator: 1];
[frac setDenominator: 3];
printf( "The fraction is: " );
[frac print];
printf( "\n" );
[frac release];
return 0;
}
De ce que je comprends, initialement, le programme commence à courir à la main.m de fichier. Je comprends le C de base de concepts, mais de toute cette "classe" et "instance" stuff est vraiment déroutant. Dans la Fraction.h le fichier @interface est la définition du numérateur et du dénominateur un nombre entier, mais qu'en est-il de faire ci-dessous avec le (void)? et quel est le but de re-définition ci-dessous? Je suis aussi très confus quant à ce qui se passe avec le (void) et (int) les parties de la Fraction.m et la façon dont tout cela est rassemblé dans la main.m de fichier. Je suppose que ce que j'essaie de dire, c'est que cela semble assez facile, programme pour apprendre les différentes parties travailler les uns avec les autres - peut-on expliquer à des non-tech jargon?
Vous devez vous connecter pour publier un commentaire.
Les gens qui viennent d'autres environnements semblent toujours croire que quelque chose de compliqué qui se passe avec le .c, .m, et .h de fichiers utilisés dans C et Objective-C programmation.
En fait, très, TRÈS simple.
Pour les fins de l'immeuble d'un projet de Développement Intégré des Milieux comme XCode - ignorer tous les .h fichiers. Ce qu'ils ont à faire est de prendre chaque .c et .m fichier et de le compiler. Si le programmeur (c'est vous) a utilisé un #include #ou directives d'importation, le compilateur insère le texte complet de la inclus/importés .h fichier où la directive a été.
Donc, si vous avez eu une .h fichier - insérer.h - qui a dit:
Et un .c fichier qui a dit:
Le compilateur aurait, après le traitement de la #include & #directives d'importation, voir ceci:
C'est très TRÈS simple fusion de fichier comportement que nous utilisons pour faire des programmes compliqués 🙂
.h est tout simplement une convention par laquelle les programmeurs peuvent se dire que le fichier est apte à être regroupées en plusieurs fois - à l'aide #include ou #import.
L' .c et .m les fichiers ne sont pas fusionnées comme ça. Chaque .c et .m fichier est compilé séparément à produire .o fichiers. Chaque .o un fichier est une collection de fonctions compilées. L' .o fichiers sont ensuite fusionnés ou "lié" à produire la version finale du programme.
L'étape de liaison veille à ce que chaque fonction existe qu'une seule fois, et que toutes les fonctions qui sont appelées à faire en fait exister quelque part.
C & Objctive-C définir une fonction spéciale qui doit exister quelque part -
main()
. Encore une fois, la langue est très détendue - il ne se soucie pas de qui .c ou .m le fichiermain()
de la fonction. Simplement qu'elle existe dans un fichier quelque part.Vous avez besoin de prendre un coup d'oeil dans La Programmation Orientée Objet et peut-être lire un peu plus dans le développement Objective-C pour obtenir une bonne prise sur les concepts de la programmation orientée objet, etc
Pour répondre à votre question "quelle est la différence entre les deux .h et .m de fichiers".h fichiers contiennent la déclaration de votre classe, donc, fondamentalement, tous les attributs et les méthodes qu'il peut utiliser. L' .m fichier est la mise en œuvre de ces méthodes.
Traduction en termes usuels, le fichier d'en-tête (.h) est une façon de dire "C'est ce que je peux faire" et de la .m est "C'est la façon dont je le fais". C'est un peu plus compliqué alors que si.
Les fichiers n'interagissent pas du tout, leur utilisation est simplement une convention, vous pouvez également mettre tout dans l'
main.m
fichier.Un bon point de départ pour apprendre l'Objective-C est le introduction à l'Objective-C langue.
En un mot, l'Objective-C est une classe C struct. Une instance est une référence à une structure qui a été alloué dans la mémoire. Une classe a un nom et une instance dispose d'un état ou de la valeur.
La chose qui définit un Objectif-C une classe à part à partir d'une structure C est la capacité de rechercher la méthode d'adresses par nom. En termes simples, la structure dispose d'une table de hachage de pointeurs de fonction identifié par un nom.
Il ya beaucoup d'autres subtilités, en Objective-C des objets, comme le comptage de référence, mais l'appel de méthodes par son nom est le cœur du problème. Un SEL est une chaîne C, mais une chaîne C n'est pas un SEL.
Autant que d'en-tête et les fichiers source, par la convention de vous déclarer l'interface d'une classe dans les fichiers d'en-tête et de définir les méthodes dans un fichier source. La définition des choses, autres que les types et les constantes, dans un fichier d'en-tête est une mauvaise pratique, comme l'est, y compris la source des fichiers. Vous êtes libre de déclarer tout ce que vous voulez dans un fichier source, mais c'est essentiellement privé pour le fichier source.
Un C exécutable, et donc un Objectif-C exécutable, a un point d'entrée à la fonction principale. Par convention principale est définie dans un fichier avec le même nom en Objective-C projets.
L'au-dessous des lignes de code dans la Fraction.h ne sont pas rien, mais des méthodes de lecture. Ils ne sont pas en redéfinissant les deux variables int déclaré au-dessus d'eux.