2010-07-15 63 views
4

我正在使用幾個自定義類的項目。我有一個CardModel(NSObject)有一些整數屬性來保存數據,並有一個Deck(NSObject)有一個數組來保存一堆CardModels,然後CardView(UIView)有一個CardModel作爲一個屬性,我做時我從Deck中選擇一個CardModel。然後我收到了一堆UIViewControllers,我在UINavigationController上移動。@class聲明的時間和地點

我的問題是關於何時何地使用@class編譯器指令。

如果我子類UIViewController通過使一個新的文件,並繼承它,我應該在MyViewController.h.m頭使用@class MyViewController和它在文件中實際使用的控制器(比如當一個控制器的頭去將要實例化另一種控制器類型並將其推送到堆棧)。或者我需要使用它?是否只有當我實際上將新屬性添加到我的課程之後才需要超出庫存實施中的內容?看起來好像我把@class放在了這個地方,確保我沒有錯誤,但是當我需要的時候我並沒有從根本上理解。

謝謝!

回答

8

您可以在.h中使用它來通知它自定義類,而不包括自定義類的.h。

例: 兩個自定義類:汽車和輪

Car.h 
---------------- 
@interface Car : NSObject { 
} 
- (void)addWheel:(Wheel*)newWheel; 
@end 

Car.h不知道的類「輪」,所以它會拋出一個錯誤,所以你可以導入W​​heel.h像這樣:

Car.h 
---------------- 
#import "Wheel.h" 

@interface Car : NSObject { 
} 
- (void)addWheel:(Wheel*)newWheel; 
@end 

但是你不需要這樣做。 Car.h不需要知道Wheel類的任何內容,只需要知道它存在。所以你用的是@class,只是說「嗨,這個班是存在的,拿我的話說吧。」

Car.h 
---------------- 
@class Wheel; 

@interface Car : NSObject { 
} 
- (void)addWheel:(Wheel*)newWheel; 
@end 

然後Car.m,當你真正需要了解的輪類(屬性,方法等)的內部,你應該導入Wheel.h那裏。

+0

謝謝 - 這似乎很清楚。標題中的@class指示引用該類的標頭是可以的。然後,相應的.m文件中的.h文件的#import爲實現提供對類的所有實際屬性和方法的訪問權限。但是這僅適用於NSObject或所有超類的子類嗎?如果說任何時候我創建一個「新文件」並選擇一個子類,那麼我會需要遵循這一點,並且任何時候我只是在我的代碼中實例化一個類,這是一個普通類,我不會? – Steve 2010-07-15 19:27:10

+0

所有的超類。 '@class X'只是簡寫爲「存在可以有指針的類X」。沒有更多,沒有更多。只有當您不能首先導入類頭時(通常在PCH文件中),才需要它。 – bbum 2010-07-15 19:36:26

+0

因此,我可能在多個頭文件中有相同的@class x'指令,只要這些頭文件需要知道'x',無論是作爲屬性還是它們實現的方法,對吧?開始凝固在我心中 - 謝謝! – Steve 2010-07-15 19:52:34

4

@class指令用於需要標頭來了解某個類但不想導入該類的頭文件;例如,當您需要避免循環依賴時。