2015-06-23 43 views
0

嗨,当我使用this answer获取类的列表自动构建一些结构。崩溃处理__NSAtom类对象

我的代码看起来像这样:

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类处理它很好地工作(index = 1548numClasses = 7628所以它不是出界的问题)。

当达到这一__NSAtom类是有崩溃。日志显示:

*** 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的优胜美地。

+0

您应该使用'objc_copyClassList'。它显着更高效。 (而不是两次获取互斥锁,它只获取一次,以及更少的条件分支)。 –

回答

2

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

看起来好像您找到的私人类不是NSObject的子类,所以它需要更细微的处理来检查继承。试试:

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

'NSAtom'实际上并不是私人的(在传统意义上)!您可以通过将整数'1'投射到一个objective-c对象来创建一个。它有一些有趣的特性:http://brian-webster.tumblr.com/post/102637339374/the-mystery-of-the-crashing-nspredicate。它也被硬编码到Objective-C运行时并在那里记录一点。 –