想象一下,您希望声明一个新协议,并通过在“基础”类上实现其方法来为其定义默认行为。 如果您不拥有此类的实现文件(例如NSObject),您可能希望通过类别实现协议的方法。 这可能会引导您进行类似下面的代码:
/* * * * * * * * * * * * * * * * * * * * * * * * *
* Formal Protocol
* * * * * * * * * * * * * * * * * * * * * * * * */
@protocol MyProto <NSObject>
- (void) myMethod;
@end
/* * * * * * * * * * * * * * * * * * * * * * * * *
* Informal Protocol (a Category Interface)
* * * * * * * * * * * * * * * * * * * * * * * * */
@interface NSObject (MyProto)
<MyProto>
@end
/* * * * * * * * * * * * * * * * * * * * * * * * *
* Category Implementation
* * * * * * * * * * * * * * * * * * * * * * * * */
@implementation NSObject (MyProto)
- (void) myMethod {
return;
}
它无法正确编译,并在行
周围产生一些警告@implementation NSObject (MyProto)
(语义问题)
- 协议中的方法未实现
- 此处声明的方法
- 直接或间接协议'NSObject'
需要
要取消这些警告,只需在协议声明中删除对NSObject协议的提及
@protocol MyProto
- (void) myMethod;
@end
这将阻止链接器在类别实现中重新要求NSObject协议的方法。