gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 03:36:26 26 4
gpt4 key购买 nike

当想要在委托(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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com