想象一下,您想声明一个新协议并通过在“基”类上实现其方法来为其定义默认行为。如果您不拥有此类的实现文件(例如 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 协议的方法。