我想用objective-c创建一个插件系统。我得到主包中所有类的列表,并检查从插件库派生的类。
int count = objc_getClassList(NULL, 0);
Class * buffer = (Class *)malloc(sizeof(Class) * count);
objc_getClassList(buf, count);
NSMutableArray * classNameArray = [NSMutableArray array];
for (int i = 0; i < count; i++)
{
[buf[i] isDerivedFromClass:[PluginBase class]]; //<<< I need this
NSString * classname=NSStringFromClass(buf[i]);
[classNameArray addObject:classname];
}
有没有相应的方法?
答案 0 :(得分:3)
使用
BOOL b = [yourObject isKindOfClass:[PluginBase class]];
您可以使用isMemberOfClass:
来获取完全类匹配。
编辑:对于类对象,请使用静态(BOOL)isSubclassOfClass:(Class)aClass
方法:
BOOL b = [yourClassObject isSubclassOfClass:[PluginBase class]];
答案 1 :(得分:1)
虽然可以使用isKindOfClass:
来完成您所描述的检查,但您确定这是您需要的吗? bundle可以声明任何类作为其主要类,如果该类提供与插件基类相同的方法,那么它可以这样使用(这是Objective-C的 duck typing < / em>的)。因此,您可以测试插件的API方法,而不是子类。
看起来你也错过了使用原则课程。查看the documentation,bundle可以在其Info.plist
文件中声明一个类,该类表示该bundle的功能的入口点。您可以只需要插件作者注册兼容的原则类,而不是搜索每个类以查找与您的API兼容的内容。这种方法允许插件作者声明多个符合类,以便使用Strategy,State或Decorator等模式,同时仍然暴露单个入口点。您的问题中描述的方法会尝试同时使用所有这些实例。