2010-04-11 3 views
21

방금 ​​목표 C를 배우기 시작했고 .h 및 .m 파일이 서로 어떻게 상호 작용하는지 혼란스러워합니다..h 및 .m 파일이 객관적인 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; 
    } 

이 프로그램이 처음 시작 :이 간단한 프로그램은 3 개 파일이 main.m 파일을 실행합니다. 나는 기본적인 C 개념을 이해하지만이 전체 "클래스"와 "인스턴스"물건은 정말로 혼란 스럽다. Fraction.h 파일에서 @interface는 분자와 분모를 정수로 정의하지만 그 밖에도 (void)로 무엇을하고 있습니까? 아래에서 다시 정의 할 목적은 무엇입니까? 나는 또한 Fraction.m의 (void) 부분과 int (int) 부분에서 일어나는 일에 대해 매우 혼란 스럽다. 그리고 이것 모두가 main.m 파일에 함께 모이게된다. 내가 말하고자하는 것은 이것이 다른 부분들이 어떻게 작동 하는지를 배울 수있는 매우 쉬운 프로그램 인 것처럼 보인다는 것입니다. 누군가가 기술이 아닌 전문 용어로 설명 할 수 있을까요?

답변

5

파일이 상호 작용하지 않습니다. 파일을 사용하는 것은 단지 규칙 일 뿐이므로 모든 내용을 main.m 파일에 넣을 수도 있습니다.

Objective-C를 배우기위한 좋은 출발점은 introduction to the Objective-C language입니다.

10

당신은 OOP의 개념에 대한 좋은 이해를 얻을 수 Object Oriented Programming으로 살펴보고 아마 오브젝티브 C 개발에 좀 더 읽을 필요 등

귀하의 질문에 대답하려면 ".H의 차이 무엇인가 and .m files ".h 파일에는 클래스에 대한 선언이 포함되어 있으므로 기본적으로 사용할 수있는 모든 속성과 메소드가 있습니다. .m 파일은이 메소드의 구현입니다.

laymans 용어에서 헤더 파일 (.h)은 "이것은 할 수있는 작업입니다"라고하며 "이것은 내가하는 일"입니다. 그것은 조금 더 복잡합니다.

0

간단히 말해서 Objective-C 클래스는 C 구조체입니다. 인스턴스는 메모리에 할당 된 구조체에 대한 참조입니다. 클래스에는 이름이 있고 인스턴스에는 상태 또는 값이 있습니다.

Objective-C 클래스를 C 구조체와 별도로 설정하는 것은 메서드 주소를 이름별로 조회 할 수있는 기능입니다. 단순화 된 용어로 구조체에는 이름으로 키가 지정된 함수 포인터의 해시 테이블이 있습니다.

Objective-C 개체에는 참조 카운팅과 같은 많은 유용한 기능이 있지만 이름으로 메서드를 호출하는 것이 핵심입니다. SEL은 C 문자열이지만 C 문자열은 SEL이 아닙니다.

헤더 및 소스 파일에 관한 한, 규약에 따라 헤더 파일의 클래스에 대한 인터페이스를 선언하고 소스 파일에서 메소드를 정의합니다. 헤더 파일에 유형과 상수 이외의 것을 정의하는 것은 소스 파일을 포함하는 것처럼 나쁜 습관입니다. 소스 파일에서 원하는 것을 자유롭게 선언 할 수는 있지만 원본 파일에는 본질적으로 비공개입니다.

C 실행 파일 및 Objective-C 실행 파일은 main 함수에 진입 점이 있습니다. 관례 상 main은 Objective-C 프로젝트에서 같은 이름의 파일로 정의됩니다.

58

다른 환경에서 온 사람들은 C 및 Objective-C 프로그래밍에서 사용되는 .c, .m 및 .h 파일로 인해 복잡한 일이 일어나고 있다고 항상 생각하는 것 같습니다.

실제로 매우 간단합니다.

프로젝트를 빌드하기 위해 XCode와 같은 통합 개발 환경 - 모든 .h 파일을 무시합니다. 그들이하는 일은 각각의 .c 및 .m 파일을 가져 와서 컴파일하는 것입니다. 프로그래머 (thats)가 #include 또는 #import 지시문을 사용하면 컴파일러는 지시문이 포함 된 포함/가져 오기 .h 파일의 전체 텍스트를 삽입합니다.

그래서, 당신은 .H 파일이 있다면 - insert.h - 말했다 :

in 

그리고 말했다 .c 파일을 :

Alice 
#include "insert.h" 
Wonderland 

컴파일러 것, 처리 한 후 #INCLUDE & # import에 지침을이를 참조하십시오

Alice 
in 
Wonderland 

그것은 병합이 아주 아주 간단한 파일입니다 우리가 복잡한 프로그램을 만드는 데 사용하는 동작 :

.h는 매우 간단하게 말해 파일이 병합에 적합하다는 것을 서로간에 - 잠재적으로 여러 번 - #include 또는 #import를 사용하여 알 수 있습니다.

.c 및 .m 파일은 이와 같이 병합되지 않습니다. 각 .c 및 .m 파일은 .o 파일을 생성하기 위해 별도로 컴파일됩니다. 각 .o 파일은 컴파일 된 함수의 모음입니다. 그런 다음 .o 파일을 병합 (또는 "링크")하여 최종 프로그램을 만듭니다. 연결 단계에서는 각 함수가 한 번만 존재하고 실제로 호출되는 모든 함수가 실제로 어딘가에 있음을 보장합니다.

C & Objctive-C는 어딘가에 존재해야하는 특별한 함수 - main()을 정의합니다. 다시 말하지만 언어는 매우 편합니다. main() 함수가 들어있는 .c 또는 .m 파일을 신경 쓰지 않습니다. 어딘가에 일부 파일에만 존재합니다.

0

Fraction.h의 아래 코드 줄은 getter 메서드가 아닙니다. 그들은 위에 선언 된 두 int 변수를 다시 정의하지 않습니다.

- (int) numerator; 
- (int) denominator; 
관련 문제