是通过调用 isKindOfClass: 来检查类的类型更合适,还是采用“鸭子打字”方法通过仅检查它是否支持您通过 respondsToSelector: 寻找的方法?
这是我正在考虑的代码,以两种方式编写:
for (id widget in self.widgets)
{
[self tryToRefresh:widget];
// Does this widget have sources? Refresh them, too.
if ([widget isKindOfClass:[WidgetWithSources class]])
{
for (Source* source in [widget sources])
{
[self tryToRefresh:source];
}
}
}
或者:
for (id widget in self.widgets)
{
[self tryToRefresh:widget];
// Does this widget have sources? Refresh them, too.
if ([widget respondsToSelector:(@selector(sources))])
{
for (Source* source in [widget sources])
{
[self tryToRefresh:source];
}
}
}
最佳答案
视情况而定!
我的经验法则是,这是专为我准备的,还是我将其传递给其他人?
在您的示例中,respondsToSelector:
很好,因为您只需要知道是否可以向对象发送该消息,这样您就可以对结果进行处理。类(class)并不是那么重要。
另一方面,如果您要将该对象传递给其他代码段,您不一定知道它将要发送什么消息。在这些情况下,您可能会强制转换对象以便传递它,这可能是您应该在强制转换之前检查它是否真的 isKindOfClass:
的线索。
要考虑的另一件事是歧义; respondsToSelector:
告诉您对象将响应消息,但如果对象返回的类型与您预期的不同,则可能会产生误报。例如,声明方法的对象:
- (int)sources;
会通过 respondsToSelector:
测试,但当您尝试在 for-in 循环中使用其返回值时会生成异常。
发生这种情况的可能性有多大?这取决于您的代码、您的项目有多大、有多少人针对您的 API 编写代码等。
关于Objective-C:检查类类型,最好使用 isKindOfClass 或 respondsToSelector?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11510337/