2012-03-27 72 views

回答

14

使用Objective-C runtime functions

  • objc_getClassList得到的Class ES
  • class_getSuperclass-superclass方法列表走超鏈
  • class_conformsToProtocol-conformsToProtocol:方法來檢查,如果一個類遵循的協議
+2

fwiw,'class_conformsToProtocol'比'-conformsToProtocol'快。這是一個大型應用程序中的瓶頸,數以千計的類 – 2013-03-27 10:03:06

7
Protocol *protocol = @protocol(YourProtocol); 

int numberOfClasses = objc_getClassList(NULL, 0); 
Class *classList = malloc(numberOfClasses * sizeof(Class)); 
numberOfClasses = objc_getClassList(classList, numberOfClasses); 

for (int idx = 0; idx < numberOfClasses; idx++) 
{ 
    Class class = classList[idx]; 
    if (class_getClassMethod(class, @selector(conformsToProtocol:)) && [class conformsToProtocol:protocol]) 
    { 
     NSLog(@"%@", NSStringFromClass(class)); 
    } 
} 
free(classList); 
+0

我是新來ObjC編程,但知道C井。你看到任何潛在的問題做類classList [numberOfClasses];而不是malloc +免費? – Tommy 2013-09-21 08:07:06

+0

@Tommy嗯,你是對的,那將更快地分配堆棧的內存 – 2013-09-22 10:00:01

+0

也更少的事情可以出錯,這幾乎總是更好。 – Tommy 2013-09-24 15:22:33

相關問題