Sono nuovo di XCode. Voglio sapere come posso sapere che tutte le classi sono conformi a determinati protocolli in XCode 4.3.1? E come posso conoscere tutte le sottoclassi di una classe?Come posso ottenere l'elenco di tutte le classi conformi a determinati protocolli in XCode 4?
risposta
Utilizzare Objective-C runtime functions.
objc_getClassList
per ottenere l'elenco deiClass
esclass_getSuperclass
o il metodo-superclass
di percorrere la catena di superclasseclass_conformsToProtocol
o il metodo-conformsToProtocol:
per verificare se una classe è conforme a un protocollo
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);
Sono nuovo alla programmazione ObjC, ma conosco bene C. Vedi qualche potenziale problema a fare Class classList [numberOfClasses]; invece di malloc + gratis? – Tommy
@ Tommy Bene, hai ragione, sarebbe più veloce allocare memoria nello stack –
e anche meno cose che possono andare storte, che è quasi sempre meglio. – Tommy
fwiw, 'class_conformsToProtocol' è WAY più veloce di' -conformsToProtocol'. Questo è un bel collo di bottiglia in una grande app con migliaia di classi –