2012-05-19 60 views
1

如果我使用额外方法定义NSObject协议的子协议,然后定义并实现一个声明与该协议一致的NSObject类别,我会在编译时收到警告。编译器抱怨我的NSObject类别没有实现在NSObject协议中声明的所有方法。NSObject实现协议上的类别导致未实现方法警告

我不明白为什么会出现这种情况。该NSObject类(在<Foundation/NSObject.h>宣布,它符合NSObject协议(以及冗余,它实现了这些方法) - ?不应该是足够

有什么问题的原因在这里

示例代码? - 如果你编译这个,你会看到在NSObject (CategoryToImplementMyProtocol)实施警告:

@protocol MyProtocol <NSObject> 
- (void)myMethod; 
@end 

@interface NSObject (CategoryToImplementMyProtocol) <MyProtocol> 
@end 

@implementation NSObject (CategoryToImplementMyProtocol) 

- (void)myMethod 
{ 
    NSLog("A la peanut butter sandwiches!"); 
} 

@end 

我发现一对夫妇的解决这一问题,但所有的答案都的“做到这一点的解决办法!”品种,而不是“这是问题的原因“多种(或者只是尽管被接受...)。我知道我可以解决这个问题。我真的很想知道为什么它失败。

回答

1

问题是您再次宣布采用<NSObject>协议。协议在Objective-C中的工作方式(更好或更糟糕)是类别实现必须实现在其接口​​中指定的所有协议。

另外,在Objective-C中,协议一致性是名义上的而不是结构性的。也就是说,一个班级对正确的方法做出反应并不足以使其采用该协议。

编辑:似乎示例代码已经改变了,我想我的答案是不是真的有关了。

+1

对不起!转录代码时是错误的(如果它是任何安慰,我在看到你的答案之前编辑了问题 - 尽管我认为它仍然有意义,不是吗?因为'MyProtocol'是'NSObject'的子协议。 –

+0

:)但我认为这种情况(我甚至没有意识到会发生)稍微比我回答的更令人困惑。由于在继承“”的类上实现这样的类别时没有这样的问题,但不要自己采用它。 –

+0

是的,我仍然没有完全看到问题 - 为什么仅仅添加我的类的主要'NSObject'类已经声明符合'NSObject'协议? –