循环引用 - 协议和子类

时间:2010-01-28 07:09:15

标签: objective-c

由于子类化或协议定义,我在一些需要导入标头的类之间得到一些循环引用(我认为)问题。我可以解释为什么事情是这样建立的,但我不确定它是否必不可少。基本上这些类正在管理互惠的数据关系。

布局是这样的:
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

4 个答案:

答案 0 :(得分:3)

您可以使用前向声明来破坏依赖循环。请参阅Referring to Other Classes中的Objective-C Programming Guide

所以C类标题应如下所示:

#import <Foundation/Foundation.h>

@protocol Class_A_Delegate;

@interface Class_C : NSObject <Class_A_Delegate> {
}

@end

答案 1 :(得分:0)

我会说它导致循环引用的错误布局。 试图重组它们,问题就会消失。

答案 2 :(得分:0)

根据建议我重新布局 - 这是布局。它不符合评论。

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

我希望这很清楚。

答案 3 :(得分:0)

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