处理 __NSAtom class 对象时崩溃

Crash when processing __NSAtom class object

您好,我正在使用 this answer 获取 class 的列表以自动构建一些结构。

我的代码是这样的:

NSMutableDictionary *result = [NSMutableDictionary dictionaryWithCapacity: 32];

Class* classes = NULL;
int numClasses = objc_getClassList(NULL, 0);
if (numClasses > 0 ) {
    classes = (Class*)malloc(sizeof(Class) * numClasses);
    numClasses = objc_getClassList(classes, numClasses);
    for (int index = 0; index < numClasses; index++) {
        Class nextClass = classes[index];

        if ([nextClass isSubclassOfClass: BaseCmd.class] &&
            ![BaseCmd isSubclassOfClass: nextClass]) {
            BaseCmd *cmd = [nextClass new];
            result[cmd.name] = cmd;
        }
    }
    free(classes);
}

return result;

所以根据答案修改非常简单。在处理 __NSAtom class 之前它确实工作得很好(index = 1548 numClasses = 7628 所以它不是越界问题)。

当达到 __NSAtom class 时会发生崩溃。日志显示:

*** NSForwarding: warning: object 0x7fff74978938 of class '__NSAtom' does not implement methodSignatureForSelector: -- trouble ahead
*** NSForwarding: warning: object 0x7fff74978938 of class '__NSAtom' does not implement doesNotRecognizeSelector: -- abort

崩溃来自条件 isSubclassOfClass

为什么不起作用?我该如何解决?

我正在使用 OS X Yosemite。

+[NSObject isSubclassOfClass:]NSObject 的 class 方法,并非所有 class 都是 NSObject 的子 class。

您似乎找到了 private class,它不是 NSObject 的子 class,因此需要更精细的处理来检查继承。尝试:

BOOL isSubclass(Class child, Class parent) {
    for (Class c = child; c != Nil; c = class_getSuperclass(c)) {
        if (c == parent) {
            return YES;
        }
   }
   return NO;
}