Objective-C:检查类类型,最好使用 isKindOfClass 或 respondsToSelector?

标签 objective-c

是通过调用 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/

相关文章:

objective-c - 在 Xcode 调试器中查看发送给对象的消息

ios - iOS 中两个位置之间的估计时间

iphone - 使用帐户框架在 iOS 5 Twitter 中转推、回复和收藏

objective-c - 自动框架链接不起作用

objective-c - 使用 LLVM 生成 ObjC 代码

iphone - 在 UITableView 中实现 UIScrollViewDelegate 方法

ios - 核心数据缓慢获取关系对象

objective-c - 是否可以在 iOS 应用程序中启用或禁用 VoiceOver?

objective-c - 带有新 SpriteKit 的球

objective-c - 生成固定时间的 NSDate