【发布时间】:2013-12-05 01:08:20
【问题描述】:
当想要在委托对象上调用协议方法时,希望实现相应的协议方法,我看到开发人员首先检查
if([delegate respondsToSelector: @selector(aMethod)])
{
//send message;
}
这样做不是更好甚至更安全吗? :
if([delegate conformsToProtocol:@protocol(MyProtocol)] && [delegate respondsToSelector: @selector(aMethod)])
{
//send message;
}
我知道,如果协议方法定义的结构正确,那么委托中不应该有任何冲突或实现可能不是针对/来自 MyProtocol。这样的冲突是牵强的,但我遇到了一个简单声明为 -(void)willStartLogin; 的协议方法定义。我确定您已经可以开始思考并建议这种协议方法有多糟糕,例如,它可能已由委托实现以供个人/内部使用,而不是在 myDelegate 协议下使用。最好这样声明 MyProtocol 的方法: -(void)myObjectWillStartLogin:(MyObject*)myObjectInstance;以便消除任何歧义并使事情变得明显。
我希望我没有遗漏任何只需要检查 respondsToSelector 的东西: 谢谢
【问题讨论】:
-
虽然你是正确的,不小心调用一个不适合当前委托模式的方法是有危险的,即使是一些 Cocoa 类也不检查“符合”和“响应”。这一切都取决于你想成为多么偏执。就我个人而言,我通常还有其他鳄鱼要与之搏斗。
-
我认为大多数图书馆只使用
respondsToSelector:。conformsToProtocol:应该在编译时检查 -
我相信 Cocoa 和 Cocoa Touch 框架从不检查协议的一致性——只响应选择器。
-
框架有时会检查协议的一致性。
标签: objective-c delegates selector protocols respondstoselector