Есть ли способ узнать, является ли класс target-c производным от другого класса perticuliar - PullRequest
0 голосов
/ 27 сентября 2010


Я хочу создать систему плагинов, используя target-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 ]

3 голосов
/ 27 сентября 2010

Используйте

BOOL b = [yourObject isKindOfClass:[PluginBase class]];

Вы можете использовать isMemberOfClass: для получения точного совпадения классов.

Редактировать: Для объектов класса используйте статический (BOOL)isSubclassOfClass:(Class)aClass метод:

BOOL b = [yourClassObject isSubclassOfClass:[PluginBase class]];
1 голос
/ 27 сентября 2010

В то время как вы можете использовать isKindOfClass: для выполнения именно той проверки, которую вы описываете, вы уверены, что это то, что вам нужно?Пакет может объявить любой класс в качестве своего основного класса, и если этот класс предоставляет те же методы, что и базовый класс вашего плагина, то он может использоваться как таковой (это Duck Typing * Objective-C * 1007)*).Поэтому вы могли бы проверять, а не подклассы, на существование методов API плагина.

Похоже, вы пропустили использование основного класса.Смотря на документацию , пакет может объявить в своем файле Info.plist класс, который представляет точку входа в функциональность этого пакета.Вместо того, чтобы искать в каждом классе что-то, совместимое с вашим API, вы можете просто потребовать, чтобы авторы плагинов зарегистрировали совместимый основной класс.Этот подход позволяет авторам плагинов объявлять несколько соответствующих классов для использования таких шаблонов, как Strategy, State или Decorator, в то же время предоставляя одну точку входа.Ваш подход, описанный в вашем вопросе, будет пытаться использовать все эти экземпляры одновременно.

...