Jus*_*rls 27 cocoa protocols objective-c categories
如果我为类创建的类别添加的方法也符合协议规定的合同,我想将该类别标记为实现协议,从而向Obj-C预处理器指示class也有效地实现了协议.
示例代表(为了清楚起见,感谢Ole!):
@protocol SomeDelegate <NSObject>
- (void)someDelegateMessage;
@end
Run Code Online (Sandbox Code Playgroud)
示例类别:
@interface NSObject (SomeCategory) <SomeDelegate>
- (void)someDelegateMessage;
@end
Run Code Online (Sandbox Code Playgroud)
并且具有其他典型的实现
@implement NSObject (SomeCategory)
- (void)someDelegateMessage {}
@end
Run Code Online (Sandbox Code Playgroud)
当我实际尝试这个时,我会收到每个NSObject方法的警告:
警告:类别'SomeCategory'的执行不完整
警告:找不到'-description'的方法定义
...
警告:找不到'-isEqual:'的方法定义
警告:类别'SomeCategory'没有完全实现'NSObject'协议
如果我<SomeDelegate>
从声明中删除,工作正常,但当然NSObject不被识别为SomeDelegate
Jen*_*ton 13
解决方法是在没有实现的类别上声明协议,并在不同的类别中实现该方法,例如:
@interface NSObject (SomeCategory) <SomeDelegate>
- (void)someDelegateMessage;
@end
@implementation NSObject (SomeCategory_Impl)
- (void)someDelegateMessage {}
@end
Run Code Online (Sandbox Code Playgroud)
如果这样做,NSObject
将被视为<SomeDelegate>
在编译时符合,并且运行时检查someDelegateMessage
将成功.但是,conformsToProtocol:
运行时检查将失败.
当然,您应该提交一个错误,请求在核心类上声明的方法不会生成警告.
您的协议声明是否包含NSObject
协议?像这样:
@protocol SomeDelegate <NSObject>
...
Run Code Online (Sandbox Code Playgroud)
这就是警告的来源,因为现在您的类别没有实现完整的协议.在我输入的测试代码中,NSObject
从协议中删除会删除编译器警告.
归档时间: |
|
查看次数: |
7737 次 |
最近记录: |