Ios 如何是';isSubclassOfClass';NSObject中定义的选择器无效吗?

Ios 如何是';isSubclassOfClass';NSObject中定义的选择器无效吗?,ios,objective-c,xcode,inheritance,selector,Ios,Objective C,Xcode,Inheritance,Selector,我正在尝试对我正在处理的一个项目进行一些调试,并希望了解指定特定变量的ViewController的类型。所以我创建了一个if语句,如下所示: if ([controller isSubclassOfClass:[UINavigationController class]]) { NSLog(@"It's a navigation controller!"); } “控制器”是使用 DetailViewController *controller = (Det

我正在尝试对我正在处理的一个项目进行一些调试,并希望了解指定特定变量的ViewController的类型。所以我创建了一个if语句,如下所示:

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

    }
“控制器”是使用

DetailViewController *controller = (DetailViewController *)[[segue destinationViewController]topViewController];
DetailViewController是从UIViewController继承的简单类。但是,我收到一个编译器错误,它说,
No visible@interface for'DetailViewController'声明选择器'isSubclassOfClass:'

这怎么可能?当我三次映射isSubclassOfClass的引用时,它表示这是在NSObject中定义的类方法。既然所有对象都继承自NSObject,那么DetailViewController怎么可能不知道该选择器

当我三次映射isSubclassOfClass的引用时,它表示这是在NSObject中定义的类方法


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

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

使用实例方法
-isKindOfClass:

if ([controller isKindOfClass:[UINavigationController class]]) {
    NSLog(@"It's a navigation controller!");
}
if ([[controller class] isSubclassOfClass:[UINavigationController class]]) {
    NSLog(@"It's a navigation controller!");
}
- (BOOL)isKindOfClass:(Class)aClass
使用类方法
+isSubclassOfClass:

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

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

声明以+开头的方法是类方法。类对象实现这些方法,而不是该类的实例。因此,这种方法:

+ (BOOL)isSubclassOfClass:(Class)aClass
是一个类方法

你可以像杰弗里·托马斯在回答的第一部分所展示的那样使用它:

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

相反,方法
是类的种类:

if ([controller isKindOfClass:[UINavigationController class]]) {
    NSLog(@"It's a navigation controller!");
}
if ([[controller class] isSubclassOfClass:[UINavigationController class]]) {
    NSLog(@"It's a navigation controller!");
}
- (BOOL)isKindOfClass:(Class)aClass
…是一个实例方法。您可以分辨出来,因为它的声明以“-”开头,而不是“+”。学习在每个方法声明的开头查找“+”或“-”,以查看它是类方法还是实例方法。如果编译器不允许您发送文档中显示的消息,请返回并仔细检查。我已经用Objective-C编程好几年了,但这仍然偶尔会让我头疼

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

[controller isKindOfClass:[UINavigationController class]]

正如其他人所说,错误在于控制器不是类对象,所以不能在其上调用isSubclassOfClass