我在extern
文件的@interface
块中声明了很少.h
个变量。它们在.m
文件中分配。在我的@interface
(一种优选的类方法)的一种方法中,我想通过反射来枚举这些变量,但我根本不知道它是否可能,是怎么回事?
我的代码示例:
Consts.h
extern NSString *MyConst1;
extern NSString *MyConst2;
Consts.m
NSString *MyConst1 = nil;
NSString *MyConst2 = nil;
+ (void)load {
MyConst1 = ...;
MyConst2 = ...;
}
+ (void)someMethod {
// i could use class_copyIvarList for objective c properties/ivars,
// but is it possible to get that MyConts1 and MyConst2 via reflection ?
// I understand, that C have different namespace,
// and I have no experience with it.
}
答案 0 :(得分:0)
Objective-C支持Objective-C对象的反射。反射是有效的,因为每个Obj-C类都包含必要的元数据(属性名称,方法名称等)。
Objective-C绝不会改变C语言。 Objective-C运行时基本上是用C实现的,编译器只将Objective-C转换为C函数调用。
不,您不能在任何Objective-C类的上下文之外对全局变量使用反射。
如果你想要反思,请把它们包装成一个类。
然而,请注意,使用反射几乎不是一个好的解决方案。通常它被滥用来解决由不良架构引起的问题。
答案 1 :(得分:0)
ObjC中没有类变量。只有实例可以在ObjC中有变量。即使你在@interface或@implementation和@end之间声明一个全局,它仍然只是一个全局,ObjC实际上并不知道它。
只有.m文件中的ObjC部分支持内省。另一种方法是创建一个包含返回常量的方法的单例,然后可以枚举其方法。或者,您可以创建一个返回常量数组的函数/方法。为避免重复常量和数组,可以使用X宏技术:
#define OSC_TYPE_CONSTANTS X(MyConst1) \
X(MyConst2)
// Header:
#define X(n) extern NSString* n;
OSC_TYPE_CONSTANTS
#undef X
// Implementation:
#define OSC_STRINGIFY(n) #n
#define X(n) NSString* n = OSC_STRINGIFY(n);
OSC_TYPE_CONSTANTS
#undef X
#define X(n) n,
NSArray* gAllTypesArray = [NSArray arrayWithObjects: OSC_TYPE_CONSTANTS nil];
#undef X
你需要什么?这些常量是直接编译到您的应用程序中,还是在它们导出的框架中?根据这一点,可能存在涉及CFBundle的CFBundleGetDataPointerFromName或dlsym的解决方案。