Objective c C型腔静脉曲张的客观C反射

Objective c C型腔静脉曲张的客观C反射,objective-c,c,reflection,Objective C,C,Reflection,我在.h文件的@interface块中声明了几个extern变量。它们在.m文件中分配。在我的@interface(更可取的类方法)的一个方法中,我想通过反射枚举这些变量,但我完全不知道这是可能的,怎么可能? 我的代码示例: Consts.h extern NSString *MyConst1; extern NSString *MyConst2; Consts.m NSString *MyConst1 = nil; NSString *MyConst2 = nil; + (void)l

我在
.h
文件的
@interface
块中声明了几个
extern
变量。它们在
.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. 
}

Objective-C支持Objective-C对象的反射。反射之所以有效,是因为每个Obj-C类都包含必要的元数据(属性名、方法名等)

Objective-C不会以任何方式改变C语言。Objective-C运行时基本上是用C实现的,编译器只将Objective-C转换为C函数调用

不,不能在任何Objective-C类的上下文之外对全局变量使用反射

如果需要反射,请将它们包装到类中


但是,请注意,使用反射几乎从来都不是一个好的解决方案。通常它被滥用来解决由糟糕的体系结构引起的问题。

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

你需要这个做什么?这些常量是直接编译到你的应用程序中,还是在导出它们的框架中?根据这一点,可能会有涉及Cbundle的CbundleGetDataPointerFromName或dlsym的解决方案。

在C中没有反射。如果要枚举超过个值,请将它们放入数组中。若要为它们设置值,请枚举指向它们的指针。@Sulthan放入数组是显而易见的。我对不制作大量重复代码感兴趣。也许objc有一些c语言的运行时魔法?放在@interface中的c变量与放在@interface中的不同,因此它们可能会通过objc以某种方式反映出来?Objective-c对c没有任何魔力。Objective-c创建由c结构组成的对象,并使用额外的元数据允许对Obj-c对象进行反映。但C只是C。