1

我有一个定义几百个常量的 .h 文件。让我们假设这是其中之一:

#define KDSomeItem      1

我知道 Objective-C 运行时 API 可用于检索实例变量名称列表:就像在这个问题中详述的那样:How do I list all fields of an object in Objective-C? 我也知道 getter[object valueForKey:theName]可用于访问我之前的问题中发现的 ivars:如何使用保存其名称的字符串访问属性/变量

我的问题是可以用常量做类似的事情吗?那就是我可以:

a) 以编程方式获取所有常量的列表

b)如果我有一个字符串保存其名称,则访问一个常量

例如,如果我有一个这样的字符串,NSString * theName = @"KDSomeItem";我可以使用这个字符串来评估我的常量吗?

4

2 回答 2

1

您将无法做到这一点:与实例变量不同,#define-d 常量在预处理器处理完它们后不会留下痕迹。它们不会留下任何元数据 -甚至在 Objective C 编译器正确分析您的代码之前,KDSomeItem程序主体中的所有实例都将被替换。1

如果您需要在运行时使用常量名称,则需要自己构建所有必要的元数据。为此,您可能需要查看预处理器的“字符串化”运算符:

#define STR(X) #X

此宏可应用于预处理器常量,并生成带有其名称的 C 字符串文字:

const char *nameOfKDSomeItem = STR(KDSomeItem); // same as "KDSomeItem"
于 2012-08-24T16:26:39.153 回答
0

没有。您的常量是一个预处理器宏。它以文本形式替换到您使用它的源代码中。

于 2012-08-24T16:28:11.937 回答