我正在 iPhone 上使用 Objective-C,需要知道“类”是否继承自“NSObject”。
我尝试检查它是否响应 NSObject 选择器:
bool success = [myClass respondsToSelector:@selector(class)];
但你可以猜到发生了什么......它甚至没有响应“respondsToSelector:”,所以它抛出一个“不实现 doesNotRecognizeSelector:”异常。
我试图捕获该异常,但看起来无法用 @try-@catch 捕获它。
有任何想法吗?
直接进入 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 块捕获。我已将它们作为错误报告给苹果,并被告知我的错误是重复的,所以他们肯定知道。您是在真实设备上还是在模拟器中尝试了您的代码?
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
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)