Подтвердить что ты не робот

Поиск классов, которые заявляют, что они соответствуют определенному протоколу, используя среду выполнения Objective-C

Я пытаюсь выяснить способ "тегировать" классы, которые будут написаны позже, чтобы я мог найти их во время выполнения, но не применяя использование определенных родительских классов. В настоящее время я ищу, возможно, применение протокола, а затем поиск всех классов, которые имеют этот протокол.

Но я не могу понять, как это сделать.

Кто-нибудь знает, можно ли найти все классы, которые реализуют определенный протокол во время выполнения? или альтернативно - есть ли лучший способ "пометить" классы и найти их?

4b9b3361

Ответ 1

На всякий случай кто-то заинтересован в этом старом вопросе, я в конце концов написал код, в котором расположены все пакеты для приложения, и отсканировал классы в этих пакетах. Это было гораздо более эффективно, чем использование кода на основе objc_getClassList, поскольку оно сканировало ограниченное число классов в отличие от всего времени выполнения.

Ответ 2

Не похоже, что это должно быть слишком сложно, используя Objective-C API-интерфейс Runtime. В частности, похоже, что вы можете использовать objc_getClassList и class_conformsToProtocol, чтобы сделать что-то вроде:

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

Ответ 3

Я думаю, вам придется перебирать список классов (objc_getClassList()) и проверять, реализует ли каждый этот протокол (class_conformsToProtocol()).