C型变量的客观C反射

时间:2017-01-30 09:36:41

标签: objective-c c reflection

我在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. 
}

2 个答案:

答案 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的解决方案。