2010-01-28 33 views
3

我得到一些循环引用(我认为)之间的几个类之间的问题,需要导入的标头,由于子类或协议定义。我可以解释为什么事情是以这种方式建立的,但我不确定这是至关重要的。基本上这些类正在管理相互对多的数据关系。循环引用 - 协议和子类

布局是这样的:
A类导入B类,因为它是B类的委托并需要它的协议定义。
B类输入C类,因为它是C类的子类。
C类输入A类,因为它是A类的委托并需要它的协议定义。

下面是说明问题的一些示例代码。我得到的错误如下所示:在A类 - “无法找到Class_B_Delegate的协议定义”。 在B类中 - “无法找到类C的接口声明 - 类B的超类。”在C类中 - “无法找到Class_A_Delegate的协议定义”。

A级标头:

#import <Foundation/Foundation.h> 
#import "Class_B.h" 

@protocol Class_A_Delegate 
@end 

@interface Class_A : NSObject <Class_B_Delegate> { 
} 

@end 

B类首标:

#import <Foundation/Foundation.h> 
#import "Class_C.h" 

@protocol Class_B_Delegate <NSObject> 
@end 

@interface Class_B : Class_C { 
} 

@end 

C类部首:

#import <Foundation/Foundation.h> 
#import "Class_A.h" 

@interface Class_C : NSObject <Class_A_Delegate> { 
} 

@end 

回答

0

我最终将协议定义放在单独的头文件中,这似乎工作。

0

我要说其不良布局引起环状参照。 试图重组他们,问题就会消失。

3

您可以使用正向声明来打破依赖周期。请参阅Objective-C Programming Guide中的Referring to Other Classes

所以C类头应该是这样的:

#import <Foundation/Foundation.h> 

@protocol Class_A_Delegate; 

@interface Class_C : NSObject <Class_A_Delegate> { 
} 

@end 
+1

我试过这个,但我仍然收到有关无法找到协议定义的警告。我最终将协议定义放在单独的头文件中,并且目前为止似乎工作正常。我们拭目以待... – blindjesse 2010-01-28 18:31:18

0

在应对建议我重新调整布局 - 这里的布局。它不适合评论。

视图控制器A管理汽车对象列表并调用视图控制器B添加汽车对象。当B完成时,它调用它的委托A来让它现在添加一个汽车对象。现在,汽车对象可以有许多驱动程序对象,所以当B添加汽车时,它可以使用视图控制器C的视图控制器C来显示驱动程序对象的列表.D显示类似于A显示方式的驱动程序对象汽车对象。 C子类D允许选择类型接口。由于D显示驱动程序对象,并且驱动程序可以有许多汽车,因此D调用具有类似于C功能的视图控制器E,以允许选择汽车对象。 E是A的一个子类。

我希望这很清楚。