2010-06-16 82 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