有没有办法找出Objective-c类是否来自另一个特定类

时间:2010-09-27 08:54:27

标签: objective-c plugins


 我想用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]; 

 }

有没有相应的方法?

2 个答案:

答案 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等模式,同时仍然暴露单个入口点。您的问题中描述的方法会尝试同时使用所有这些实例。