警告:忽略'...'的重复协议定义

时间:2011-11-15 15:23:02

标签: objective-c ios xcode xcode4 llvm

我该如何回应此警告?

  

警告:忽略'...'的重复协议定义

我的协议声明在它自己的.h文件中,并且在我的项目中的一些其他文件中被#import'。

嗯,以防万一,这是包含协议声明的整个头文件:

#import <Foundation/Foundation.h> 

@class Wrapper;

@protocol WrapperDelegate

@required
- (void)wrapper:(Wrapper *)wrapper didRetrieveData:(NSData *)data;

@optional
- (void)wrapperHasBadCredentials:(Wrapper *)wrapper;
- (void)wrapper:(Wrapper *)wrapper didCreateResourceAtURL:(NSString *)url;
- (void)wrapper:(Wrapper *)wrapper didFailWithError:(NSError *)error;
- (void)wrapper:(Wrapper *)wrapper didReceiveStatusCode:(int)statusCode;

@end

感谢您的任何建议。

4 个答案:

答案 0 :(得分:6)

检查以确保您的项目中没有添加头文件两次,或者两个不同的文件都实现了协议。这就是导致警告出现的原因。

答案 1 :(得分:3)

是的我遇到了同样的问题。我无法在Xcode项目中找到重复的头文件。 但是当我从Xcode中查找finder时,我在项目中找到了协议的2头文件。 删除一个解决了问题。 谢谢。

答案 2 :(得分:1)

这里只是为了补充我遇到的具体问题的现有答案。

基本上,编译器不是说谎。它发现了一个类,协议,枚举,定义或其他任何存在于有问题的头文件中的定义。

错误可能是您的头文件和标题搜索路径的组合。

首先,问题似乎令人费解,因为我们知道语句#import只会导入尚未实现的文件。因此,与#include不同,这个问题不应该发生,对吗?

#import确实有用。但是,如果您的标头设置不正确,那么虽然它可能会遇到具有相同名称的文件,例如MyLibrary.h,如果该文件存在于两个不同的位置,这两个位置都位于标题搜索路径中,那么Xcode会将这些文件视为两个不同的文件。

就我而言,我有一个静态库构建阶段,它复制了公共标题。

enter image description here

依赖产品搜索了上面的文件夹 - 在Build Settings中定义为include/$(TARGET_NAME) - 我项目的源文件夹。

这意味着两个不同的文件夹 - 都在标题搜索路径中 - 包含文件MyLibrary.h。该文件中的所有内容都会导致重复或重新定义编译器警告或链接器错误。

TLDR:同一个文件可能位于两个不同的文件夹中,两者都在您的标题搜索路径中。检查您的路径,如果您已将静态库合并到项目或工作区中,还要检查公共标头在调查过程中的复制位置。

答案 3 :(得分:0)

请确保您已使用

#import

而不是

#include

找出差异here