使用Objective-C运行时查找声明它们符合特定协议的类

dre*_*kka 18 runtime objective-c

我正在试图找出一种方法来"标记"将在稍后编写的类,以便我可以在运行时找到它们,但不强制使用特定的父类.目前我正在考虑应用协议,然后找到所有具有该协议的类.

但我无法弄清楚如何.

有谁知道是否有可能找到在运行时实现特定协议的所有类?或者 - 有没有更好的方法来"标记"类并找到它们?

aro*_*oth 27

使用Objective-C Runtime API看起来不太难.具体来说,看起来你可以使用objc_getClassListclass_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)

  • 在ARC下参考:http://stackoverflow.com/questions/8730697/using-objc-getclasslist-under-arc (2认同)

dre*_*kka 1

为了防止有人对这个老问题感兴趣,我最终编写了一些代码来定位应用程序的所有捆绑包,并扫描这些捆绑包中的类。这比使用基于的代码要高效得多,objc_getClassList因为它扫描有限数量的类而不是整个运行时。

如果您有兴趣,可以在这里找到我使用的代码: https: //github.com/drekka/Alchemic/blob/master/alchemic/NSBundle%2BAlchemic.m