【发布时间】:2015-11-05 14:33:43
【问题描述】:
首先,我见过this question 和this,但我的问题并没有解决。
我在自己的头文件中定义了一个协议ProtocolA。然后我有两个类ClassA 和ClassB,它们都符合这个协议,所以protocol-header 被导入到它们的头文件中。
现在有点复杂了。 ClassA 在第三个 ClassC 中使用(并因此导入)。此类符合第二个协议ProtocolB。这个协议也有它自己的头文件,它使用和导入ClassB。所以我的ClassC 导入(直接或间接)ClassA 和ClassB(它们都导入ProtocolA)。这给了我关于ProtocolA的以下警告:
warning: duplicate protocol definition of '…' is ignored
为什么会这样?据我了解,#import 宏的发明正是为了避免#include 遇到的此类问题。如何在不使用包含防护的情况下解决问题?我无法真正删除任何导入。
编辑:这里是说明情况的代码:
ProtocolA.h
@protocol ProtocolA <NSObject>
- (void)someMethod;
@end
ClassA.h
#import "ProtocolA.h"
@interface ClassA : NSObject <ProtocolA>
...
@end
ClassB.h
#import "ProtocolA.h"
@interface ClassB : NSObject <ProtocolA>
typedef enum Type {
TypeB1,
TypeB2
} TypeB;
...
@end
ProtocolB.h
#import "ClassB.h"
@protocol ProtocolB <NSObject>
- (TypeB)someMethod;
@end
ClassC.h
#import "ProtocolB.h"
@interface ClassC : NSObject <ProtocolB>
...
@end
ClassC.m
#import "ClassC.h"
#import "ClassA.h" // the warning appears here
@implementation ClassC
...
@end
【问题讨论】:
-
您需要发布代码;你的描述很难理解。
-
我添加了示例代码。虽然我承认,但仍然很难理解。
-
使用前向声明就是答案。如果您只在
ClassB.h中使用ClassA *,请在文件开头使用@class ClassA;。协议也一样。
标签: objective-c llvm llvm-clang