声明两个包含彼此类型的实例变量的类

时间:2010-06-16 19:39:22

标签: objective-c cocoa

假设你希望有两个这样的类,每个类都声明一个属于另一个类的实例变量。

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

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

似乎不可能用这些实例变量声明这些类。为了使A包含B类的IV,B必须已经编译,因此其@interface必须在A之前。但出于同样的原因,A必须放在B之前。

将两个类声明放在单独的文件中,并且#import - 彼此的'.h'也不起作用,原因显而易见。

那么,解决方案是什么?或者这是(1)不可能还是(2)表明设计不好?

2 个答案:

答案 0 :(得分: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头文件。

答案 1 :(得分:3)

这是@class关键字的用途。它告诉编译器某些东西被用作一个类而没有编译器必须知道它的任何内容。

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

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