Objective-C:从父类(super class)中获取子类列表

标签 objective-c

在 Objective-C 中有一种方法可以询问类是否有任何子类实现。

我有一个基类,它有多个子类。我想遍历所有子类并对每个子类执行类选择器。

编辑:

我有一组类可以处理某些类型的数据。每个处理器子类都有一个基类,该基类提供每个处理器所需的方法。

每个类都知道它可以处理什么数据,并且某些类可以比其他类更好地处理某些类型的数据。

我想在每个类上都有一个类方法,它会向工厂类提供响应,说是的,我可以处理该数据,并给出它处理数据的能力的指示。

然后工厂将根据哪个类表示它可以最好地处理数据来决定实例化哪个类。

我从 2009 年也发现了这个问题(我在发布这个之前搜索过但没有找到任何东西)Discover subclasses of a given class in Obj-C .

编辑 2:

+ (void)load 方法看起来是我正在寻找的完美解决方案。所以我现在有以下内容:

+ (void)registerSubclass:(Class)subclass {
    NSLog(@"Registered %@", subclass);
}

在我的基类中,这是我的潜艇。

+(void)load {
    [BaseSwitch registerSubclass:[self class]];
}

这现在为每个子类显示一条调试消息。

我的下一个问题是(可能是一个愚蠢的问题),我如何存储在 registerSubclass 方法中注册的类。有没有办法让我以后可以读取类变量?

编辑 3:

在这里找到了一些示例代码 A simple, extensible HTTP server in Cocoa

这给我留下了以下内容,毕竟说了又做了,看起来很简单。但我想我会把它放在这里以供将来引用。

@implementation BaseSwitch

static NSMutableArray *registeredSubclasses;

+ (void)registerSubclass:(Class)subclass {
    if (registeredSubclasses == nil) {
        registeredSubclasses = [[NSMutableArray alloc] init];
    }

    [registeredSubclasses addObject:subclass];

    NSLog(@"Registered %@", subclass);
}

+ (void)logSubclasses {
    for (int i = 0; i < [registeredSubclasses count]; i++) {
        NSLog(@"%@", [registeredSubclasses objectAtIndex:i]);
    }
}

@end

感谢大家的建议,我会把这个问题再留几天,以防出现其他问题。

最佳答案

这个函数给你一个类的所有子类:

#import <objc/runtime.h>

NSArray *ClassGetSubclasses(Class parentClass)
{
  int numClasses = objc_getClassList(NULL, 0);
  Class *classes = NULL;

  classes = (__unsafe_unretained Class *)malloc(sizeof(Class) * numClasses);
  numClasses = objc_getClassList(classes, numClasses);

  NSMutableArray *result = [NSMutableArray array];
  for (NSInteger i = 0; i < numClasses; i++)
  {
    Class superClass = classes[i];
    do
    {
      superClass = class_getSuperclass(superClass);
    } while(superClass && superClass != parentClass);

    if (superClass == nil)
    {
      continue;
    }

    [result addObject:classes[i]];
  }

  free(classes);

  return result;
}

取自Cocoa with Love .

关于Objective-C:从父类(super class)中获取子类列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7923586/

相关文章:

objective-c - objective c NSString 比较

iphone - 如何让一段代码在单独的线程中运行?

ios - 为什么我可以在我的案例中访问单元测试类中的私有(private)方法

iphone - 如何检测我的用户使用的是哪个 iOS 设备?

objective-c - 如何清除绘制 uiview?

iphone - UITableView prepareForSegue 将 indexPath 分配给发件人?

objective-c - Mac Mountain Lion 从 CLI 应用发送通知

ios - tableView viewForHeaderInSection 从 ios7 中的第 1 节开始

iOS:使用应用委托(delegate)来存放全局变量

iphone - Xcode 项目代码更改在保存构建运行后未更新 100%