2011-09-22 28 views
2

可能重複的關鍵字:
@class vs. #import類和接口的頭文件使用Objective-C

我是新來的Objective-C,我已經看到了一個例子看喜歡:

#import <UIKit/UIKit.h> 

@class MapKitSampleViewController; 

@interface MapKitSampleAppDelegate : NSObject <UIApplicationDelegate> { 
    UIWindow *window; 
    MapKitSampleViewController *viewController; 
} 

@property (nonatomic, retain) IBOutlet UIWindow *window; 

@property (nonatomic, retain) IBOutlet MapKitSampleViewController *viewController; 

@end 

上面的代碼存儲在「MapKitSampleAppDelegate.h」文件中,我想問一下lin是什麼意思e 3「@class MapKitSampleViewController;」?我們可以將其更改爲#import「MapKitSampleViewController.h」嗎?

回答

6

我想問的是3號線 「MapKitSampleViewController」的含義是什麼?我們可以將其更改爲#import 「MapKitSampleViewController.h」?

是的。

@class關鍵字是「前向聲明」。你告訴編譯器的是這個類將在這個類中使用,但是它的頭部導入將在別處。

如果你在.m文件中查看,你會發現#import「MapKitSampleViewController.h」將會出現在這裏。

爲什麼?

爲什麼這樣實施(我想,無論如何),是爲了防止循環進口。想象一下這樣一個場景,將出現以下情況:

Class1.h

​​

Class2.h現在

#import Class1.h 

,如果我沒有錯,這裏所發生的是,在編譯過程中,它會反覆導入標題和不良內容。 @class關鍵字旨在防止發生這種情況,因爲這些文件的導入將發生在.m文件中,而不是在.h文件中。

BTW這是@class vs. #import

重複所以,你可能會發現在那個問題,這個話題更深入的論述。

+0

+1還可以注意到,這與C++中的前向聲明和#include一樣。 – jv42

+0

是的,#import「MapKitSampleViewController.h」在.m文件中。那麼,是否有必要在.h文件中寫入@class XXX? –

+0

@Charles Yeung它沒有必要(因爲它會編譯得很好),但推薦它是防止我描述的問題的良好實踐。 –

0

是的,你可以改變它,但這會增加編譯時間,並且不會帶來任何好處。

「@class MapKitSampleViewController;」是一個前向聲明請參見http://en.wikipedia.org/wiki/Forward_declaration 當使用前向聲明時,您必須注意,只能爲類型引用使用正向聲明的類名稱。