【问题标题】:Duplicate protocol definition warning重复协议定义警告
【发布时间】:2015-11-05 14:33:43
【问题描述】:

首先,我见过this questionthis,但我的问题并没有解决。

我在自己的头文件中定义了一个协议ProtocolA。然后我有两个类ClassAClassB,它们都符合这个协议,所以protocol-header 被导入到它们的头文件中。

现在有点复杂了。 ClassA 在第三个 ClassC 中使用(并因此导入)。此类符合第二个协议ProtocolB。这个协议也有它自己的头文件,它使用和导入ClassB。所以我的ClassC 导入(直接或间接)ClassAClassB(它们都导入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


【解决方案1】:

不要在ProtocolB标头中导入ClassB,只需在其中使用@class ClassB;并删除#import "ClassB"

【讨论】:

  • 没有迹象表明 OP 正在从协议头导入类头,除非我错过了...
  • 再读一遍,“这个类符合第二个协议ProtocolB。这个协议也有它自己的头文件,它使用和导入ClassB。”
  • ClassB 标头确实在ProtocolB 中导入。这样做是因为ProtocolB 的方法之一返回一个枚举类型,该类型在ClassB 的标头中定义。所以@class ClassB; 不会真正起作用,除非我能以某种方式转发声明一个枚举。
  • 将你的结构声明移动到它自己的文件中
  • Daij-Djan,当你遵守协议时不能转发声明,因为类不知道它的方法等。它只在你单独使用它作为类型时才有效。
猜你喜欢
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 2021-01-30
  • 2015-10-04
相关资源
最近更新 更多