Поиск классов, которые заявляют, что они соответствуют определенному протоколу, используя среду выполнения Objective-C
Я пытаюсь выяснить способ "тегировать" классы, которые будут написаны позже, чтобы я мог найти их во время выполнения, но не применяя использование определенных родительских классов. В настоящее время я ищу, возможно, применение протокола, а затем поиск всех классов, которые имеют этот протокол.
Но я не могу понять, как это сделать.
Кто-нибудь знает, можно ли найти все классы, которые реализуют определенный протокол во время выполнения? или альтернативно - есть ли лучший способ "пометить" классы и найти их?
Ответы
Ответ 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()).