我正在玩Objective C(iOS应用程序)中的一些反思并构建一个自定义的测试环境,我正在尝试获取我在项目中创建的类列表,因此我可以迭代这些并查看对于使用反射的某些方法声明。
我的问题是检索该列表。我不想手动将每个类输入到我的反射类中的列表或某个静态字段中,而是让它对任何项目都是通用的。
列表可以是类名列表,也可以是Class
类型的对象。
我确实设法在文档中找到objc_getClassList()
函数:https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html
但是这会创建一个ALL类的列表,我将无法确定哪些是用户定义的,哪些不是。我试图在互联网上寻求指导,但没有找到答案或类似的问题。
感谢任何帮助!
编辑:
现在我也尝试使用objc_copyImageNames()
希望我能够将我的项目作为图像找到,然后使用objc_copyClassNamesForImage()
来获取列表,但没有运气因为项目不被认为是图片,值得拍摄我想。
答案 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类参考。