当想要在代理对象上调用协议方法时,希望该代理对象实现相应的协议方法。我看到有些开发人员首先检查
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: 的必要性的东西:
谢谢
respondsToSelector:
。conformsToProtocol:
应该在编译时检查。 - Bryan Chen