objective-c - 在 Obj-C 中发现给定类的子类

标签 objective-c cocoa reflection

有没有办法在运行时发现给定类存在哪些子类?

编辑:从目前的答案来看,我认为我需要进一步澄清我正在尝试做的事情。我知道这在 Cocoa 中不是一种常见的做法,并且可能会有一些警告。

我正在使用动态创建模式编写解析器。 (参见 Buck 和 Yacktman 合着的 Cocoa Design Patterns 一书,第 5 章。)基本上,解析器实例处理堆栈,并实例化知道如何执行特定计算的对象。

如果我可以获得 MYCommand 类的所有子类,例如,我可以为用户提供可用命令的列表。此外,在第 5 章的示例中,解析器有一个替换字典,因此可以使用 +、-、* 和/等运算符。 (它们映射到 MYAddCommand 等)对我来说,这些信息似乎属于 MyCommand 子类,而不是解析器实例,因为它有点违背动态创建的想法。

最佳答案

不直接,不。但是,您可以获得在运行时注册的所有类的列表,并查询这些类的直接 父类(super class)。请记住,这不允许您找到类在继承树上的所有祖先,只能找到直接父类(super class)。

您可以使用 objc_getClassList()获取在运行时注册的 Class 对象的列表。然后,您可以遍历该数组并在那些 Class 对象上调用 [NSObject superclass] 以获取其父类(super class)的 Class 对象。如果由于某种原因你的类不使用 NSObject 作为它们的根类,你可以使用 class_getSuperclass()相反。

我还应该提到,如果您认为有必要进行这种发现,您可能对应用程序设计的思考不正确。很可能还有另一种更传统的方法来完成您要完成的任务,它不涉及对 Objective-C 运行时的自省(introspection)。

关于objective-c - 在 Obj-C 中发现给定类的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1810628/

相关文章:

swift - 类似于 Finder 应用程序 NSOutlineView Cocoa Swift 的拖放

objective-c - OSX 布局从代码定位导致位置错误

objective-c - 将在线 GIF 图像加载到 NSImageView 中

ios - UIWebView 仅在添加到 View 时才起作用

java - 使用反射在运行时调用带有指定参数的构造函数 [Java]

c# - AddEventHandler 使用反射

.net - 用于以编程方式比较程序集 .NET(反射、MSIL)的 API

iphone - 是否允许调用 [self release] 来控制对象的生命周期?

ios - 观察原始指针的值

ios - 在继续之前等待 NSNotification