我刚刚开始学习目标C,我真的很困惑.h和.m文件如何相互作用。这个简单的程序有3个文件:
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;
}
据我所知,该程序最初开始运行main.m文件。我理解基本的C概念,但这整个“类”和“实例”的东西真的很混乱。在Fraction.h文件中,@interface将分子和分母定义为整数,但是下面用(void)做了什么呢?以下重新定义的目的是什么?我也对Fraction.m的(void)和(int)部分发生了什么以及如何在main.m文件中汇总所有这些内容感到困惑。我想我想说的是,这似乎是一个相当容易的程序来学习不同部分如何相互协作 - 任何人都可以用非技术术语来解释吗?
答案 0 :(得分:62)
来自其他环境的人似乎总是相信C和Objective-C编程中使用的.c,.m和.h文件会发生复杂的事情。
实际上,非常非常简单。
为了建立项目集成开发环境 - 比如XCode - 忽略所有.h文件。他们所做的是获取每个.c和.m文件并进行编译。如果程序员(那是你)使用了任何#include或#import指令,编译器会在指令所在的位置插入包含/导入的.h文件的整个文本。
所以,如果你有一个.h文件 - insert.h - 那说:
in
一个.c文件说:
Alice
#include "insert.h"
Wonderland
编译器在处理完#include&amp; #import指令,请参阅:
Alice
in
Wonderland
这是我们用来制作复杂程序的非常简单的文件合并行为:)
.h是一个非常简单的约定程序员可以使用#include或#import告诉对方该文件适合合并 - 可能多次 -
.c和.m文件没有这样合并。每个.c和.m文件单独编译 - 生成.o文件。每个.o文件都是已编译函数的集合。然后合并.o文件 - 或“链接” - 以生成最终程序。 链接步骤确保每个函数只存在一次,并且所有被调用的函数实际上都存在于某处。
C&amp; C&amp; Objctive-C定义了一个必须存在于某处的特殊函数 -main()
。同样,语言非常宽松 - 它不关心main()
函数所在的.c或.m文件。仅仅是它存在于某个文件中。
答案 1 :(得分:13)
您需要查看Object Oriented Programming,或者更多地了解Objective-C开发,以便更好地掌握OOP等概念
要回答你的问题“.h和.m文件之间有什么区别”,.h文件包含你的类的声明,所以基本上它可以使用的所有属性和方法。 .m文件是这些方法的实现。
在外行人看来,头文件(.h)是一种说“这就是我能做的”的方式,而.m是“我就是这样做的”。虽然它有点复杂。
答案 2 :(得分:6)
这些文件完全没有交互,使用它们只是一种惯例,您也可以将所有内容放在main.m
文件中。
学习Objective-C的一个很好的起点是introduction to the Objective-C language。
答案 3 :(得分:0)
简而言之,Objective-C类是一个C结构。实例是对已在内存中分配的此类结构的引用。类具有名称,实例具有状态或值。
将Objective-C类与C结构区分开来的是能够按名称查找方法地址的能力。简单来说,struct有一个按名称键入的函数指针的哈希表。
Objective-C对象中有许多其他细节,比如引用计数,但按名称调用方法是它的关键。 SEL是C字符串,但C字符串不是SEL。
就头文件和源文件而言,按照惯例,您将头部文件中的类声明为接口,并在源文件中定义方法。在头文件中定义除了类型和常量之外的东西是一种不好的做法,包括源文件。您可以在源文件中自由声明任何内容,但它基本上是源文件的私有。
C可执行文件,因此是Objective-C可执行文件,在main函数中有一个入口点。按照惯例,main是在Objective-C项目中具有相同名称的文件中定义的。
答案 4 :(得分:-1)
Fraction.h中的以下代码行不仅仅是getter方法。它们没有重新定义在它们上面声明的两个int变量。
- (int) numerator;
- (int) denominator;