2010-04-11 4 views
21

Acabo de empezar a aprender el objetivo C y estoy realmente confundido de cómo los archivos .h y .m interactúan entre sí. Este sencillo programa tiene 3 archivos:Descripción concisa de cómo los archivos .h y .m interactúan en el objetivo c?

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 

Main.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; 
    } 

Por lo que entiendo, el programa se inicia al principio ejecutando el archivo main.m Entiendo los conceptos básicos de C, pero todo este asunto de "clase" e "instancia" es realmente confuso. En el archivo Fraction.h, la interfaz @ define el numerador y el denominador como un entero, pero ¿qué más está haciendo debajo con el (vacío)? y ¿cuál es el propósito de redefinir a continuación? También estoy bastante confundido en cuanto a lo que está sucediendo con las porciones (nulas) y (int) de Fraction.m y cómo todo esto se junta en el archivo main.m. Creo que lo que estoy tratando de decir es que este parece ser un programa bastante fácil para aprender cómo funcionan las diferentes partes entre sí. ¿Alguien podría explicarlo en una jerga no tecnológica?

Respuesta

5

Los archivos no interactúan en absoluto, usarlos es simplemente una convención, también puede poner todo en el archivo main.m.

Un buen punto de partida para aprender Objective-C es el introduction to the Objective-C language.

10

Es necesario tomar una mirada en Object Oriented Programming y tal vez leer un poco más en el desarrollo de Objective-C para obtener una buena comprensión de los conceptos de programación orientada a objetos, etc

Para responder a su pregunta "¿cuál es la diferencia entre .h y los archivos .m ", .h contienen la declaración para su clase, así que básicamente todos los atributos y métodos que puede utilizar. El archivo .m es la implementación de estos métodos.

En términos simples, el archivo de encabezado (.h) es una forma de decir "Esto es lo que puedo hacer" y el .m es "Así es como lo hago". Sin embargo, es un poco más complicado que eso.

0

En pocas palabras, una clase Objective-C es una estructura C. Una instancia es una referencia a tal estructura que ha sido asignada en la memoria. Una clase tiene un nombre y una instancia tiene un estado o valor.

Lo que establece una clase Objective-C aparte de una estructura C es la capacidad de buscar direcciones de método por nombre. En términos simplificados, la estructura tiene una tabla hash de punteros de función codificados por nombre.

Hay muchas otras sutilezas en los objetos de Objective-C, como el recuento de referencias, pero llamar a los métodos por su nombre es el quid de la cuestión. Un SEL es una cadena C, pero una cadena C no es un SEL.

En cuanto a los archivos de encabezado y fuente, por convención usted declara la interfaz a una clase en los archivos de encabezado y define los métodos en un archivo fuente. Definir cosas que no sean tipos y constantes en un archivo de encabezado es una mala práctica, como lo es incluir archivos fuente. Usted es libre de declarar cualquier cosa que desee en un archivo fuente, pero es esencialmente privado para el archivo fuente.

Un ejecutable C, y por lo tanto un ejecutable Objective-C, tiene un punto de entrada en la función principal. Por convención principal se define en un archivo con el mismo nombre en proyectos de Objective-C.

58

Las personas que provienen de otros entornos siempre parecen creer que algo complicado está sucediendo con los archivos .c, .m y .h utilizados en la programación C y Objective-C.

En realidad, es muy, MUY simple.

Para el propósito de construir un proyecto Entornos de desarrollo integrados, como XCode, ignore todos los archivos .h. Lo que hacen es tomar cada archivo .c y .m y compilarlo. Si el programador (es usted) ha utilizado alguna directiva #include, o #import, el compilador inserta todo el texto del archivo .h incluido/importado donde estaba la directiva.

lo tanto, si usted tenía un archivo .h - insert.h - que dijo:

in 

Y un archivo .c que dijo:

Alice 
#include "insert.h" 
Wonderland 

el compilador, después de procesar el # include & directivas import, vea esto:

Alice 
in 
Wonderland 

es esta muy muy simple combinación de archivos comportamiento que utilizamos para crear programas complicados :)

.h es simplemente una convención mediante la cual los programadores pueden decirse mutuamente que el archivo es adecuado para combinarse, potencialmente varias veces, con #include o #import.

Los archivos .c y .m no se combinan de esa manera. Cada archivo .c y .m se compila por separado: para producir archivos .o. Cada archivo .o es una colección de funciones compiladas. Los archivos .o se fusionan, o "vinculados", para generar el programa final. El paso de vinculación asegura que cada función existe solo una vez, y que todas las funciones que se llaman de hecho existen en alguna parte.

C & Objctive-C define una función especial que debe existir en alguna parte - main(). De nuevo, el lenguaje es muy relajado, no importa qué archivo .c o .m sea la función main(). Simplemente que existe en algún archivo en alguna parte.

0

Las siguientes líneas de código en Fraction.h no son más que métodos getter. No están redefiniendo las dos variables int declaradas encima de ellos.

- (int) numerator; 
- (int) denominator; 
Cuestiones relacionadas