我正在尝试对正在处理的项目进行调试,并且想知道分配特定变量的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]]