2010-11-22 73 views
3

我在iPhone上使用Objective-C进行工作,需要知道'类'是否继承自'NSObject'。如何判断某个类是否继承自NSObject(Objective-C)

我试图检查其是否响应一个NSObject的选择:

bool success = [myClass respondsToSelector:@selector(class)]; 

,但你能猜到发生了什么事......它甚至没有回应“respondsToSelector:”所以它抛出一个“未实现doesNotRecognizeSelector:“异常。

我试图捕获该异常,但它看起来不能用@ try- @ catch捕获。

任何想法?

+2

我认为更好的问题是,你如何来被处理这些类,不从NSObject继承。除了议定书外,不应该有任何东西。 – Chuck 2010-11-22 23:33:16

+1

@Chuck和`NSProxy`。 – 2010-11-23 00:52:20

+0

你的意思是`@selector(class)`。我认为SDK中没有任何回应`+ class:`的东西。 – 2010-11-23 03:00:25

回答

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 
} 
4

您可以使用方法isKindOfClass:isMemberOfClass:来确定某个类是否是另一个类的子类,或者它是否是特定的类。

1

respondsToSelector:本身就是一个NSObject定义的选择器,所以你不能使用它。我不相信如果不深入Objective-C的内部,就有办法做到这一点。

请问为什么你的对象不是NSObject的后代?苹果非常强烈建议你不要尝试创建它们,并且有充分的理由。

-3

类'Class'不从NSObject继承。这意味着NSObject定义的方法(例如isKindOfClassrespondsToSelector)不能用于它。

你打算怎么处理它呢?

相关问题