由于子类化或协议定义,我在一些需要导入标头的类之间得到一些循环引用(我认为)问题。我可以解释为什么事情是这样建立的,但我不确定它是否必不可少。基本上这些类正在管理互惠的数据关系。
布局是这样的:
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 :(得分: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)
我最终将协议定义放在单独的头文件中,这似乎有效。