为什么 '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]]
我正在尝试对我正在进行的项目进行一些调试,并且想知道 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]]