【问题标题】:Category on NSObject implementing protocol causes Unimplemented Method warningsNSObject 实现协议上的类别导致未实现的方法警告
【发布时间】:2012-05-19 07:41:06
【问题描述】:

如果我用额外的方法定义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

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

【问题讨论】:

    标签: objective-c nsobject objective-c-category


    【解决方案1】:

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

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

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

    【讨论】:

    • 对不起!转录代码时出错(如果有什么安慰的话,我在看到您的答案之前编辑了问题 - 尽管我认为它仍然有意义,不是吗?因为 MyProtocolNSObject 的子协议)。
    • :) 但我认为这个案例(我什至没有意识到会发生)比我回答的案例更令人困惑。因为在继承 &lt;NSObject&gt; 的类上实现此类类别没有这样的问题,但自己不采用它。
    • 是的,我仍然没有完全看到问题 - 为什么我添加我的类别的主要 NSObject 类也已经声明符合 NSObject 协议还不够?
    • 是的。 (顺便说一句,为了确保它不是特殊情况,我用任意协议和类检查了它,但它仍然失败)。关于 Objective-C 似乎有这样一个事实,其中一个类别的接口无法满足另一个类别的接口施加的约束。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多