' isSubclassOfClass'在NSObject中定义时,它不是有效的选择器吗?

时间:2015-01-01 14:31:31

标签: ios objective-c xcode inheritance selector

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

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

    }

'控制器'使用

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

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

怎么可能?当我对isSubclassOfClass的引用进行tripleTap时,它说它是NSObject中定义的类方法。由于所有对象都是从NSObject继承的,所以DetailViewController怎么可能不知道那个选择器?

3 个答案:

答案 0 :(得分:3)

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

使用实例方法-isKindOfClass:

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

使用类方法+isSubclassOfClass:

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

答案 1 :(得分:3)

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

声明以+开头的方法是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]]

答案 2 :(得分:2)

  

当我对isSubclassOfClass的引用进行tripleTap时,它表示它是NSObject中定义的类方法

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