2010-04-11 39 views
21

我剛開始學習目標C,並且很困惑.h和.m文件如何相互交互。這個簡單的程序有3個文件:簡要描述.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; 
    } 

據我瞭解,該計劃最初啓動運行main.m文件。我理解C的基本概念,但是這些「類」和「實例」的東西真的很混亂。在Fraction.h文件中,@interface將分子和分母定義爲一個整數,但是下面還有(void)做了什麼?以及下面重新定義的目的是什麼?我也對Fraction.m的(void)和(int)部分發生了什麼以及所有這些在main.m文件中如何結合感到困惑。我想我想說的是,這似乎是一個相當簡單的程序,以瞭解不同部分如何相互協作 - 任何人都可以用非技術術語來解釋嗎?

回答

10

你需要看一看到Object Oriented Programming也許讀多一點到的Objective-C開發,以獲取有關OOP的概念,把握好等

要回答你的問題「是什麼樣的.h之間的區別和.m文件「,.h文件包含你的類的聲明,所以基本上可以使用的所有屬性和方法。 .m文件是這些方法的實現。

在俗語中,頭文件(.h)是「這是我能做的事」的一種說法,而.m是「這就是我怎麼做的」。儘管如此,這有點複雜。

0

簡而言之,Objective-C類是一個C結構。一個實例是對在內存中分配的這種結構的引用。一個類有一個名稱,一個實例有一個狀態或值。

設置Objective-C類與C結構分開的事情是能夠按名稱查找方法地址。簡而言之,該結構具有由名稱鍵入的函數指針的哈希表。

Objective-C對象中還有許多其他細節,例如引用計數,但按名稱調用方法是關鍵。 SEL是C字符串,但C字符串不是SEL。

就頭文件和源文件而言,按照慣例,你可以在頭文件中聲明一個類的接口,並在源文件中定義這些方法。在頭文件中定義除類型和常量之外的東西是不好的做法,因爲包含源文件。你可以自由地在源文件中聲明你想要的任何東西,但它對於源文件來說基本上是私有的。

一個C可執行文件,因此一個Objective-C可執行文件在主函數中有一個入口點。按照慣例,main在Objective-C項目中的同名文件中定義。

58

來自其他環境的人總是會相信C和Objective-C編程中使用的.c,.m和.h文件會發生一些複雜的事情。

其實,它非常非常簡單。

爲了建立項目集成開發環境(如XCode),忽略所有.h文件。他們所做的就是獲取每個.c和.m文件並編譯它。如果程序員(即你)使用了任何#include或#import指令,編譯器會插入指令所在的包含/導入的.h文件的全部文本。

所以,如果你有.h文件 - insert.h - 即說:

in 

而且.c文件提到:

Alice 
#include "insert.h" 
Wonderland 

編譯器會,處理後的的#include &#進口指令,看到這一點:

Alice 
in 
Wonderland 

正是這種非常非常簡單的文件合併我們用來製作複雜程序的行爲:)

.h是一個非常簡單的約定,程序員可以使用#include或#import來告訴對方文件適合合併 - 可能多次合併。

.c和.m文件不會像那樣合併。每個.c和.m文件都被單獨編譯 - 生成.o文件。每個.o文件都是編譯函數的集合。 .o文件然後被合併 - 或「鏈接」 - 以產生最終的程序。 鏈接步驟確保每個函數只存在一次,並且所調用的所有函數實際上都存在於某處。

C & Objctive-C定義了一個必須存在的特殊函數 - main()。同樣,這種語言非常輕鬆 - 它不關心哪個.c或者.m文件在main()函數中。僅僅是它存在於某個文件的某個地方。

0

Fraction.h中的以下代碼行不是什麼,只是getter方法。它們不重新定義在它們上面聲明的兩個int變量。

- (int) numerator; 
- (int) denominator;