dre*_*kka 18 runtime objective-c
我正在试图找出一种方法来"标记"将在稍后编写的类,以便我可以在运行时找到它们,但不强制使用特定的父类.目前我正在考虑应用协议,然后找到所有具有该协议的类.
但我无法弄清楚如何.
有谁知道是否有可能找到在运行时实现特定协议的所有类?或者 - 有没有更好的方法来"标记"类并找到它们?
aro*_*oth 27
使用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);
}
Run Code Online (Sandbox Code Playgroud)
为了防止有人对这个老问题感兴趣,我最终编写了一些代码来定位应用程序的所有捆绑包,并扫描这些捆绑包中的类。这比使用基于的代码要高效得多,objc_getClassList因为它扫描有限数量的类而不是整个运行时。
如果您有兴趣,可以在这里找到我使用的代码: https: //github.com/drekka/Alchemic/blob/master/alchemic/NSBundle%2BAlchemic.m