为什么 'isSubclassOfClass' 在 NSObject 中定义时不是有效的选择器?

How is 'isSubclassOfClass' not a valid selector when it is defined in NSObject?

我正在尝试对我正在进行的项目进行一些调试,并且想知道 ViewController 正在分配的特定变量的类型。所以我创建了一个 if 语句,如下所示:

    if ([controller isSubclassOfClass:[UINavigationController class]]) {
        NSLog(@"It's a navigation controller!");

    }

'controller' 是在上面使用

创建的
DetailViewController *controller = (DetailViewController *)[[segue destinationViewController]topViewController];

DetailViewController 是一个简单的 class 继承自 UIViewController。但是我收到一个编译器错误 No visibile @interface for 'DetailViewController' declares the selector 'isSubclassOfClass:'

这怎么可能?当我三次点击 isSubclassOfClass 的引用时,它说它是 NSObject 中定义的 class 方法。 DetailViewController 怎么可能不知道那个选择器,因为所有对象都继承自 NSObject?

When I tripleTap the reference for isSubclassOfClass it says it's a class method defined in NSObject.

这是一个 class 方法,您正在实例上使用它。尝试 isKindOfClass

执行此操作的标准方法是 -isKindOfClass:,而不是 +isSubclassOfClass:,但可以使用 +isSubclassOfClass:

使用实例方法-isKindOfClass:

if ([controller isKindOfClass:[UINavigationController class]]) {
    NSLog(@"It's a navigation controller!");
}

使用class方法+isSubclassOfClass:

if ([[controller class] isSubclassOfClass:[UINavigationController class]]) {
    NSLog(@"It's a navigation controller!");
}

其他两位回复者都对您的问题给出了正确答案,但我想澄清一些事情。

声明以 + 开头的方法是 CLASS 方法。 class 对象实现了这些方法,而不是 class 的实例。所以这个方法:

+ (BOOL)isSubclassOfClass:(Class)aClass

是一个class方法。

您可以像 Jeffery Thomas 在其回答的第一部分中演示的那样使用它:

[[controller class] isSubclassOfClass:[UINavigationController class]]

[controller class] 位获取控制器对象的 class 对象,然后向该 class 对象发送 isSubclassOfClass 消息。

相比之下,方法isKindOfClass:

- (BOOL)isKindOfClass:(Class)aClass

...是一个实例方法。您可以分辨出来,因为它的声明以“-”而不是“+”开头。学会在每个方法声明的开头查找“+”或“-”,看看它是 class 方法还是实例方法。如果编译器不允许您发送您在文档中看到的消息,请返回并仔细检查。我已经在 Objective-C 编程好几年了,这仍然偶尔会困扰我。

您将 isKindOfClass 消息发送到要测试 class 成员资格的对象实例:

[controller isKindOfClass:[UINavigationController class]]