2012-03-27 6 views

risposta

14

Utilizzare Objective-C runtime functions.

  • objc_getClassList per ottenere l'elenco dei Class es
  • class_getSuperclass o il metodo -superclass di percorrere la catena di superclasse
  • class_conformsToProtocol o il metodo -conformsToProtocol: per verificare se una classe è conforme a un protocollo
+2

fwiw, 'class_conformsToProtocol' è WAY più veloce di' -conformsToProtocol'. Questo è un bel collo di bottiglia in una grande app con migliaia di classi –

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

Sono nuovo alla programmazione ObjC, ma conosco bene C. Vedi qualche potenziale problema a fare Class classList [numberOfClasses]; invece di malloc + gratis? – Tommy

+0

@ Tommy Bene, hai ragione, sarebbe più veloce allocare memoria nello stack –

+0

e anche meno cose che possono andare storte, che è quasi sempre meglio. – Tommy

Problemi correlati