2012-03-27 10 views

Respuesta

14

Utilice Objective-C runtime functions.

  • objc_getClassList para obtener la lista de Class es
  • class_getSuperclass o el método -superclass a caminar por la cadena de superclase
  • class_conformsToProtocol o el método de -conformsToProtocol: para comprobar si una clase es conforme a un protocolo
+2

fwiw, 'class_conformsToProtocol' es MUCHO más rápido que' -conformsToProtocol'. Esto es todo un cuello de botella en una gran aplicación con miles de clases. –

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

Soy nuevo en la programación de ObjC, pero conozco bien a C. ¿Ve algún problema potencial al hacer Class classList [numberOfClasses]; en lugar de malloc + gratis? – Tommy

+0

@Tommy Bueno, tienes razón, eso sería más rápido para asignar memoria en la pila –

+0

y también menos cosas que pueden salir mal, que casi siempre es mejor. – Tommy

Cuestiones relacionadas