objective-c - ( 符合协议(protocol) : && RespondsToSelector: ) vs just ( respondsToSelector: )

标签 objective-c delegates selector protocols respondstoselector

当想要在委托(delegate)对象上调用协议(protocol)方法时,希望实现相应的协议(protocol)方法,我看到开发人员首先检查

if([delegate respondsToSelector: @selector(aMethod)])
    {
        //send message;
    }

这样做不是更好甚至更安全吗? :

if([delegate conformsToProtocol:@protocol(MyProtocol)] && [delegate respondsToSelector: @selector(aMethod)])
    {
        //send message;
    }

我知道,如果协议(protocol)方法定义的结构正确,那么在委托(delegate)中永远不会有任何冲突或实现可能不是为 MyProtocol 设计的/来自 MyProtocol。这种冲突是牵强附会的,但我遇到了一个简单声明为 -(void)willStartLogin; 的协议(protocol)方法定义。我确定您已经可以开始思考并提出这样的协议(protocol)方法有多么糟糕,例如,它可能已经由委托(delegate)实现以供个人/内部使用,而不是在 myDelegate 协议(protocol)下使用。最好这样声明 MyProtocol 的方法: -(void)myObjectWillStartLogin:(MyObject*)myObjectInstance;以消除任何歧义并使事情变得显而易见。

我希望我没有遗漏任何只需要检查 respondsToSelector 的东西: 谢谢

最佳答案

我不太确定你在问什么,但也许这会有所帮助:

协议(protocol)是方法的集合,有些是必需的,有些是可选的。 conformsToProtocol: 回答的问题是一个对象是否声称 实现了一堆方法——必需的——并且可以实现其他一些——可选的。请注意,这里是声明,而不是确实,因为未能实现所需的方法不会阻止编译(这只是一个警告)。

respondsToSelector: 回答的问题是一个对象是否实现了一个特定的方法。与 conformsToProtocol: 不同,这为该特定方法提供了明确的答案。

respondsToSelector: 的确定性是它被广泛使用的原因。

您可能认为除了方法之外还检查协议(protocol)会更好,因为这意味着该方法更有可能按照您的预期执行,如果是这样,则同时使用 respondsToSelector:conformsToProtocol: 告诉您您寻求的答案...有点像 - 因为协议(protocol)实际上只是方法名称和签名,这些方法的行为是隐含的而不是强制执行的 (*)。

HTH.

(* 如果你想强制执行契约(Contract),请查看,例如 Eiffel)

关于objective-c - ( 符合协议(protocol) : && RespondsToSelector: ) vs just ( respondsToSelector: ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20389465/

相关文章:

iphone - Objective-C:无法将图像写入文档目录

ios - 将 IndexPath 行值传递给委托(delegate)函数而不是 Sender.tag 以删除图像项目 CollectionView Swift

Jquery ID属性包含选择器和变量

ios - OpenSSL 服务器未收到来自 WKWebView 的媒体(音频/视频)请求

objective-c - NSAlert - 你可以有一个自定义图标吗?

c# - 表单中的按钮事件处理程序

c# - 为什么我不能将方法作为对象传递?

CSS 悬停选择器不起作用

Jquery 选择最近的复选框收件箱不起作用

ios - 适用于应用程序轮询服务器的iOS7本地通知,用于在后台运行的新关注数据