2

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

我不明白为什么会这样。类NSObject(in<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

我发现了几个问题来解决这个问题,但所有的答案都是“做这个解决方法!” 多样性,而不是“这是问题的原因”多样性(或者只是完全错误,尽管被接受了......)。我知道我可以解决这个问题。我真的很想了解它为什么会失败。

4

1 回答 1

1

问题是您<NSObject>再次声明采用该协议。协议在 Objective-C 中的工作方式(无论好坏)是类别实现必须实现其接口中指定的所有协议。

此外,在 Objective-C 中,协议一致性是名义上的而不是结构性的。也就是说,对于一个类来说,响应正确的方法还不足以让它采用该协议。

编辑:似乎示例代码已更改,我想我的答案不再相关。

于 2012-05-19T07:47:51.583 回答