项目目标-c中的类列表

时间:2013-11-17 15:01:20

标签: ios objective-c c reflection

我正在玩Objective C(iOS应用程序)中的一些反思并构建一个自定义的测试环境,我正在尝试获取我在项目中创建的类列表,因此我可以迭代这些并查看对于使用反射的某些方法声明。

我的问题是检索该列表。我不想手动将每个类输入到我的反射类中的列表或某个静态字段中,而是让它对任何项目都是通用的。

列表可以是类名列表,也可以是Class类型的对象。

我确实设法在文档中找到objc_getClassList()函数:https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html
但是这会创建一个ALL类的列表,我将无法确定哪些是用户定义的,哪些不是。我试图在互联网上寻求指导,但没有找到答案或类似的问题。

感谢任何帮助!

编辑:
现在我也尝试使用objc_copyImageNames()希望我能够将我的项目作为图像找到,然后使用objc_copyClassNamesForImage()来获取列表,但没有运气因为项目不被认为是图片,值得拍摄我想。

2 个答案:

答案 0 :(得分:7)

您可以使用objc_getClassList()文档中的代码 如果在您的课程中定义了[NSBundle bundleForClass:class],请检查每个课程 应用程序:

int numClasses;
Class * classes = NULL;

classes = NULL;
numClasses = objc_getClassList(NULL, 0);

if (numClasses > 0 )
{
    classes = (__unsafe_unretained Class *)malloc(sizeof(Class) * numClasses);
    numClasses = objc_getClassList(classes, numClasses);
    for (int i = 0; i < numClasses; i++) {
        Class c = classes[i];
        NSBundle *b = [NSBundle bundleForClass:c];
        if (b == [NSBundle mainBundle]) {
            NSLog(@"%s", class_getName(c));
            // ...
        }
    }
    free(classes);
}

答案 1 :(得分:0)

如果您正在使用某个库,那么我建议创建一个自定义类,这将保留其他类的列表。

// XYZLibRegister.h

@interface XYZLibRegister : NSObject

@property (nonatomic, copy, readonly) NSArray *classArray;

+ (void)registerClassNameString:(NSString *)clsNameString;

@end

在.m文件中添加静态NSMutableArray并在+(void)加载方法中初始化它。

// XYZLibRegister.m

NSMutableArray *classArray;

@implementation XYZLibRegister

- (void)classArray
{
    return [NSArray arrayWithArray:classArray];
}

+ (void)load
{
    classArray = [[NSMutableArray alloc] init];
}

+ (void)registerClassNameString:(NSString *)clsNameString
{
    [classArray addObject:clsNameString];
}

@end

然后,您可以在库类中使用它,将其隐藏在.m文件中。

// XYZYourClass.m

#include "XYZLibRegister.h"

@implementation XYZYourClass

+ (void)load
{
    [XYZLibRegister registerClassNameString:NSStringFromClass([this class])];
}

@end

现在您可以使用XYZLibRegister类作为库寄存器。

我还建议你学习NSObject类参考。