Поиск классов, которые объявляют, что они соответствуют определенному протоколу, используя среду выполнения Objective C - PullRequest
18 голосов
/ 18 июня 2011

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

Но я не могу понять, как.

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

Ответы [ 3 ]

27 голосов
/ 18 июня 2011

Не похоже, чтобы это было слишком сложно, используя Objective-C Runtime API . В частности, похоже, что вы можете использовать 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);
}
1 голос
/ 24 января 2018

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

Если вы заинтересованы, вы можете найти код, который я использовал здесь: https://github.com/drekka/Alchemic/blob/master/alchemic/NSBundle%2BAlchemic.m

1 голос
/ 18 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...