2011-06-18 7 views
17

Estoy intentando encontrar una forma de "etiquetar" clases que se escribirán más tarde para poder encontrarlas en tiempo de ejecución, pero sin aplicarlas el uso de una clase primaria específica. Actualmente estoy buscando tal vez aplicar un protocolo y luego encontrar todas las clases que tienen ese protocolo.Encontrar clases que declaran que se ajustan a un protocolo específico utilizando el tiempo de ejecución de Objective-C

Pero no sé cómo.

¿Alguien sabe si es posible encontrar todas las clases que implementan un protocolo específico en tiempo de ejecución? o alternativamente, ¿hay una forma mejor de "etiquetar" las clases y encontrarlas?

+0

La respuesta de Aroth funcionará, pero le sugiero que vuelva a visitar su arquitectura y elimine la necesidad de hacer tal cosa. En general, tales arquitecturas débilmente acopladas llevarán a un código muy frágil y dolores de cabeza significativos de mantenimiento/refactorización en el futuro. Diversión, sin duda, pero en última instancia poco práctico. – bbum

+0

Normalmente lo haría, pero lo que estoy jugando es algo similar a los conceptos de springframework. Efectivamente estoy codificando para operar clases que no existirán hasta que mi marco esté incluido en otro proyecto. Lo que intento hacer es permitir que el desarrollador haga uso de lo que estoy haciendo sin el requisito de extender mis clases, lo que podría resultar problemático si tienen su propia jerarquía. Por lo tanto, estoy buscando formas de "etiquetar" las clases para que mi framework sepa que funciona con ellas. – drekka

+0

Cool. Sugiero que proporciones algunas clases base abstractas y que los otros desarrolladores hereden de eso, anulando la funcionalidad según sea necesario. Además, tener a los desarrolladores registrando efectivamente sus clases con su marco también es útil; eso les da la oportunidad de registrar condicionalmente algunas clases y no otras, dependiendo de la configuración. – bbum

Respuesta

0

Por si acaso alguien está interesado en esta vieja pregunta, eventualmente escribí un código que localizaba todos los paquetes para la aplicación y escaneaba las clases en esos paquetes. Esto fue mucho más eficiente que usar el código basado en objc_getClassList porque escaneaba un número limitado de clases en lugar de todo el tiempo de ejecución.

27

Parece que esto no debería ser demasiado difícil con el Objective-C Runtime API. En concreto, parece que se puede utilizar objc_getClassList y class_conformsToProtocol a hacer algo como:

Class* classes = NULL; 
int numClasses = objc_getClassList(NULL, 0); 
if (numClasses > 0) { 
    classes = malloc(sizeof(Class) * numClasses); 
    numClasses = objc_getClassList(classes, numClasses); 
    for (int index = 0; index < numClasses; index++) { 
     Class nextClass = classes[index]; 
     if (class_conformsToProtocol(nextClass, @protocol(MyTaggingProtocol))) { 
      //found a tagged class, add it to the result-set, etc. 
     } 
    } 
    free(classes); 
} 
+0

Pensé que podría tener que hacer eso, pero esperaba que hubiera una forma mejor porque parece que hay miles de clases. Aunque solo pretendo hacerlo una vez, el rendimiento no es tan importante. Gracias – drekka

+0

@ Derek - Sí, estoy bastante seguro de que tienes que iterar todo. La mayoría de los lenguajes reflexivos no llegan tan lejos como para proporcionar un tipo de consultas incorporadas "dame todas las clases conocidas que implementan X." Pero a menos que intentes haga algo realmente elaborado, debería ser suficiente para realizar la iteración una vez y almacenar en caché el resultado. – aroth

+2

bajo ARC y luego referencia: http://stackoverflow.com/questions/8730697/using-objc-getclasslist-under-arc – TopChul

1

creo que tendrá que iterar sobre la lista de clases (objc_getClassList()) y comprobar si cada uno pone en práctica el protocolo en cuestión (class_conformsToProtocol()).

Cuestiones relacionadas