我知道我可以使用类别扩展一个类(例如框架类),但是有可能让一个你不控制源代码的类实现你的一个自定义协议吗?我不仅希望在发送到实例时让它响应某些消息,而且理想情况下,在查询协议时,希望该类的对象在运行时类型检查时返回true。
答案 0 :(得分:8)
您可以定义符合协议的类别,因此您可以执行以下操作:
@interface UIWebView (MyGreatExtensions) <UITableViewDelegate>
@end
@implementation UIWebView (MyGreatExtensions)
- (CGFloat)tableView: (UITableView *)tableView heightForRowAtIndexPath: (NSIndexPath *)indexPath {
return 42.0;
}
// ...
@end
要考虑的一个小问题是,如果其他人尝试做同样的事情(例如,第三方框架也通过类别添加协议)那么你不能保证< em>你的版本将被使用(当然也不能)。
有关此方法的更多信息from Mark Dalrymple。
答案 1 :(得分:1)
我认为这是可能的。您可以通过覆盖NSObject的forwardInvocation:方法轻松地在Objective-C中创建动态代理(这是NSUndoManager如何发挥其魔力),拦截协议实现者将响应的所有未识别消息。我自己从未这样做过,所以可能有一种更优雅的方式来做到这一点。
此外,为了愚弄运行时检查以同意您的对象确实实现了协议,您可以覆盖NSObject的类方法conformsToProtocol:如下所示:
+ (BOOL)conformsToProtocol:(Protocol *)aProtocol {
if (aProtocol == @protocol(MyDynamicallyImplementedProtocol))
return YES;
return [super conformsToProtocol:aProtocol];
}
可能需要覆盖更多方法,一个例子是NSObject的instancesRespondToSelector:和resolve *:方法。检查NSObject class reference以了解更多信息。