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

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

    }


“ controller”是在上方使用创建的

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


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

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

最佳答案

其他两位答复者都为您的问题提供了正确答案,但我想澄清一下。

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

+ (BOOL)isSubclassOfClass:(Class)aClass


是一个类方法。

您将像杰弗里·托马斯(Jeffery Thomas)在其答案的第一部分中所展示的那样使用它:

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


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

相反,方法isKindOfClass:

- (BOOL)isKindOfClass:(Class)aClass


...是一个实例方法。您可以知道,因为它的声明以“-”而不是“ +”开头。学习在每个方法声明的开头查找“ +”或“-”,以了解它是类方法还是实例方法。如果编译器不允许您发送在文档中看到的消息,请返回并仔细检查。我已经在Objective-C中编程了很多年了,这仍然让我感到有些不适。

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

[controller isKindOfClass:[UINavigationController class]]

10-08 12:10