Как мне получить список всех классов, соответствующих определенному протоколу в Xcode 4?

Я новичок в Xcode. Я хочу знать, как я могу знать, что все классы соответствуют определенному протоколу в Xcode 4.3.1? И как я могу знать все подклассы одного класса?

Ответ 1

Используйте Objective-C функции времени выполнения.

  • objc_getClassList, чтобы получить список Class es
  • class_getSuperclass или -superclass для перемещения цепи суперкласса
  • class_conformsToProtocol или -conformsToProtocol:, чтобы проверить соответствие класса протоколу

Ответ 2

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);

Ответ 3

Использование ARC

int amountClasses = objc_getClassList(NULL, 0);
NSLog(@"Amount of classes: %d", amountClasses);    

Class *classes = (__unsafe_unretained Class *)malloc(sizeof(Class) * amountClasses);
amountClasses = objc_getClassList(classes, amountClasses);

for (int i = 0; i < amountClasses; i++) {
    Class class = classes[i];

    if ([NSBundle bundleForClass:class] != [NSBundle mainBundle]) { // restriction that pass classes from main bundle
        break;
    }

    NSLog(@"Class name: %s", class_getName(class));

    //List of all methods
    unsigned int amountMethod = 0;
    Method *methods = class_copyMethodList(class, &amountMethod);

    for (unsigned int i = 0; i < amountMethod; i++) {
        Method method = methods[i];

        printf("\t method named:'%s' \n", sel_getName(method_getName(method)));
    }

    free(methods);

}

free(classes);