是否可以在Objective-C中动态实现协议?

时间:2012-04-27 08:25:15

标签: objective-c ios dynamic protocols

我知道我可以使用类别扩展一个类(例如框架类),但是有可能让一个你不控制源代码的类实现你的一个自定义协议吗?我不仅希望在发送到实例时让它响应某些消息,而且理想情况下,在查询协议时,希望该类的对象在运行时类型检查时返回true。

2 个答案:

答案 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以了解更多信息。