处理 __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;
}
您好,我正在使用 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;
}