通过名称(反射)访问iOS SDK常量

通过名称(反射)访问iOS SDK常量,ios,reflection,constants,Ios,Reflection,Constants,在iOS SDK内部,可以找到许多由Apple定义的常量,如下所示: extern const CFStringRef kSomeReallyNiceConstant __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_8_0); 如果我检查是否存在这种恒定的标准方式: if (NULL == &kSomeReallyNiceConstant) 我几乎是在引用它,为了使我的代码能够正确编译,在本例中,我至少需要iOSSDK8.0或更高版

在iOS SDK内部,可以找到许多由Apple定义的常量,如下所示:

extern const CFStringRef kSomeReallyNiceConstant
    __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_8_0);
如果我检查是否存在这种恒定的标准方式:

if (NULL == &kSomeReallyNiceConstant)
我几乎是在引用它,为了使我的代码能够正确编译,在本例中,我至少需要iOSSDK8.0或更高版本

当涉及到对象和方法时,反射方法与
NSClassFromString
respondsToSelector
performSelector
的使用配合得很好

是否有机会使用某种反射(按名称访问字符串常量)来尝试获取它的值(如果它存在,则没有)?

我知道我可以使用宏来检查iOS版本,并根据这些信息执行不同的代码路径,但我不想使用这种方法

我用指针成功地做到了这一点:

#include <dlfcn.h>

// ...

int *pointer = dlsym(RTLD_SELF, "kSomeReallyNiceConstant");

if (pointer) {
    NSLog(@"Thing exists!");
} else {
    NSLog(@"Nope, doesn't exist!");
}
#include <dlfcn.h>

// ...

int *pointer = dlsym(RTLD_SELF, "kSomeReallyNiceConstant");

if (pointer) {
    NSLog(@"Thing exists!");
} else {
    NSLog(@"Nope, doesn't exist!");
}
#包括
// ...
int*pointer=dlsym(RTLD_SELF,“kSomeReallyNiceConstant”);
如果(指针){
NSLog(@“东西存在!”);
}否则{
NSLog(@“不,不存在!”);
}
但我不确定这是否会导致应用程序被拒绝。你可能知道吗


不管这种指针方法如何,我很想知道是否还有其他方法可以实现这一点?

没有什么比在这个主题上找到的建议解决方案更好的了

#包括
// ...
int*pointer=dlsym(RTLD_SELF,“kSomeReallyNiceConstant”);
如果(指针){
NSLog(@“东西存在!”);
}否则{
NSLog(@“不,不存在!”);
}