2013-05-01 61 views
2

在我的控制器的頭文件中,我需要聲明另一個控制器的實例。我是這樣做的:#import和@class在我的簡單情況下的區別

#import "BIDMyRootController.h" 
#import "BIDAnotherController.h" //I import another controller's header 

@interface BIDCurrentController : BIDMyRootController 

//I declare an instance of another controller 
@property (strong, nonatomic) BIDAnotherController *anotherController; 

@end 

上面的代碼非常簡單。沒問題!

但是,我也注意到了,或者,我可以通過以下方式使用@class來代替我的#import語句BIDAnotherController

#import "BIDMyRootController.h" 
@class BIDAnotherController //I declare another controller with @class tag 

@interface BIDCurrentController : BIDMyRootController 

//I declare an instance of another controller 
@property (strong, nonatomic) BIDAnotherController *anotherController; 

@end 

沒問題呢!

但我現在很困惑,#import "BIDAnotherController.h"@class BIDAnotherController之間的區別是什麼,那麼如果他們都ok了???


更新:

順便說一句,在BIDCurrentController實現文件,我已經再次導入BIDAnotherController

#import "BIDCurrentController.h" 
#import "BIDAnotherController.h" //import another controller again 
@implementation BIDCurrentController 
... 
@end 
+0

[@class vs. #import]可能的重複(http://stackoverflow.com/questions/322597/class-vs-import)我添加了我的答案,但回想起這個問題.. – 2013-05-01 14:53:38

+0

@class聲明類名稱作爲編譯器的類型,因此您可以定義指向該類實例的指針。沒有聲明該類的方法,屬性或實例變量,因此不能在任何地方「使用」該類型的對象,只傳遞其指針。 – 2013-05-01 15:55:44

回答

4
  • 使用@class BIDAnotherController被稱爲正向聲明BIDAnotherController,它基本上告訴編譯器它的一個實現w在將來的某個時刻存在病態。

  • #import "BIDAnotherController.h"實際上包含了BIDAnotherController.h的內容到當前文件中。

如果您只需要使用BIDAnotherController作爲屬性或參數的方法,你可以逃脫向前聲明,因爲你的代碼並不需要知道這件事除了它的存在。如果您需要使用BIDAnotherController的屬性或方法,那麼您需要導入其頭文件(否則編譯器將不知道這些屬性或方法甚至存在!)。

通常,正向聲明用於中斷兩個或多個頭文件之間的包含循環。防止循環的最簡單方法是首選@class聲明,除非您確實需要訪問類的屬性或方法。

+1

這很好。我只是想說,儘可能使用前向聲明是最好的實踐,以便儘可能使代碼保持模塊化和封裝。對於#imports來說,在一個更大的項目中非常容易失控。在你知道它之前,你有不必要的進口,進口週期和瘋狂的意大利麪條依賴關係。如果一個類只需要知道另一個類的存在,但不調用它的任何方法或設置它的任何屬性,請使用@class。 – 2013-05-01 14:59:50

+0

我已經在添加它:) – jszumski 2013-05-01 15:00:43

+0

謝謝,現在很清楚,我會在2分鐘內接受這個答案 – Mellon 2013-05-01 15:00:51

相關問題