我在iPhone上的Objective-C工作,需要知道'Class'是否继承自'NSObject'。
我尝试检查它是否响应NSObject选择器:
bool success = [myClass respondsToSelector:@selector(class)];
但你可以猜到发生了什么......它甚至没有响应“respondsToSelector:”所以它抛出了“不实现doesNotRecognizeSelector:”异常。
我试图抓住这个异常,但看起来它不能被@ try- @ catch抓住。
有什么想法吗?
答案 0 :(得分:7)
直接转到Objective-C运行时:
#import <objc/runtime.h>
/* originally posted version — works because eventually class_getSuperclass(class)
returns nil, and class_getSuperclass(nil) does so also. */
BOOL classDescendsFromClass(Class classA, Class classB)
{
while(1)
{
if(classA == classB) return YES;
id superClass = class_getSuperclass(classA);
if(classA == superClass) return (superClass == classB);
classA = superClass;
}
}
/* shorter version; exits straight after classA turns into nil */
BOOL classDescendsFromClassShorter(Class classA, Class classB)
{
while(classA)
{
if(classA == classB) return YES;
classA = class_getSuperclass(classA);
}
return NO;
}
...
if(classDescendsFromClass(classToTest->isa, [NSObject class]) ...
class_getSuperclass
执行它所说的内容,并且在Objective-C运行时中通过指针比较元类是安全的,因为每个类只有一个元类实例。 isa指针是struct objc_object中唯一肯定的东西。
编辑:此外,iPhone模拟器中存在已知的错误,导致一些异常不被try / catch块捕获。我已将它们报告为Apple的一个错误,并被告知我的重复,所以他们肯定知道。您是在真实设备上还是在模拟器中尝试过代码?
EDIT2:从本次对话中其他地方给出的更广泛的背景来看,这样的事情可能更聪明:
#import <objc/runtime.h>
BOOL classRespondsToSelector(Class classA, SEL selector)
{
return class_getInstanceMethod(classA, selector) ? YES : NO;
}
....
if(classRespondsToSelector(instance->isa, @selector(respondsToSelector:))
{
// great, we've got something that responds to respondsToSelector:; do the
// rest of our querying through there
}
答案 1 :(得分:4)
您可以使用方法isKindOfClass:
和isMemberOfClass:
来确定某个类是否是另一个类的子类,或者它是否是特定的类。
答案 2 :(得分:1)
respondsToSelector:
本身就是一个NSObject定义的选择器,所以你不能使用它。如果不深入了解Objective-C的内部结构,我不相信有办法做到这一点。
请问为什么你的对象不是NSObject的后代? Apple非常强烈建议您不要尝试创建它们,并且有充分的理由。
答案 3 :(得分:-3)
类'Class'不从NSObject继承。这意味着NSObject定义的方法(例如isKindOfClass
或respondsToSelector
)不能在其上使用。
首先你想用它做什么?