2010-06-16 83 views
0

假設您希望有兩個這樣的類,每個類聲明一個實例變量,該實例變量是其他類的實例變量。聲明兩個包含彼此類型的實例變量的類

@interface A : NSObject { 
    B *something; 
} 
@end 

@interface B : NSObject { 
    A *something; 
} 
@end 

似乎不可能用這些實例變量聲明這些類。爲了讓A包含B類IV,B必須已經編譯好,所以它的@interface必須在A之前。但是出於同樣的原因A必須放在B之前。

將兩個類聲明放在單獨的文件中,而對方的'.h's也不起作用,原因很明顯。

那麼,解決方案是什麼?或者這是(1)不可能的,或者(2)反映了不好的設計?

+1

另請參閱:http://stackoverflow.com/questions/322597/objective-c-class-vs-import – 2010-06-16 19:51:05

+0

謝謝菲利克斯。如果我只知道搜索「遠期課堂宣言!」 – 2010-06-16 20:24:34

回答

4

要做到這一點,你需要使用正向類聲明:

//a.h 
@class B; 

@interface A : NSObject { 
    B *something; 
} 
@end 

// b.h 

@class A 

@interface B : NSObject { 
    A *something; 
} 
@end 

所以編譯器會知道A和B類。在這兩個類的實現文件中只包含a.h和b.h頭文件。

3

這是@class關鍵字的用途。它告訴編譯器,有些東西被用作一個類,而編譯器不必知道它的任何內容。

@class B;  
@interface A : NSObject { 
    B *something; 
} 
@end 

@class A; 
@interface B : NSObject { 
    A *something; 
} 
@end