(ConformsToProtocol:&& RespondsToSelector:)vs just(respondsToSelector:)

 LoisWangol_326 发布于 2023-02-12 18:44

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

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的东西:谢谢

1 个回答
  • 我不确定你在问什么,但也许这会有所帮助:

    协议是方法的集合,一些是必需的,一些是可选的.回答的问题conformsToProtocol:是一个对象是否声称实现了一堆方法 - 必需的 - 并且可能实现其他一些方法 - 可选的方法.需要注意的是号称在这里,而不是,因为未能实现所需的方法并不妨碍编译(这只是一个警告).

    回答的问题respondsToSelector:是对象是否实现了特定的方法.与此不同,这为这种特殊方法提供了明确的答案conformsToProtocol:.

    确切的性质respondsToSelector:是它常用的原因.

    您可能认为除了方法之外检查协议更好,因为它意味着该方法更有可能达到您期望的效果,如果是这样,使用两者respondsToSelector:conformsToProtocol:告诉您您寻求的答案......有点 - 作为协议实际上只是方法名称和签名,隐含而不是强制执行这些方法的行为(*).

    HTH.

    (*如果你想强制执行合同,例如,埃菲尔)

    2023-02-12 18:46 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有